2017-03-03 16 views
0

私はWagtailのブログ記事全体の単語数を取得するテンプレートタグを作成する方法が不思議です。私は周りを見回して、Pythonでいくつかの異なる方法を見てきましたが、与えられたビューはしばしば抽象化されています。多くの場合、作成者がカウントしたいかもしれないwagtailテンプレート(イントロ、ボディなど)に複数の部分が存在する可能性があるので、クエリがより複雑になるようです。表示Wordでのブログ投稿の投稿Wagtailで

これは管理者にはa nice packageがありますが、ユーザー側に表示したいと思います。

これは簡単な答えですが、まだWagtailのテンプレートに新しい変数を渡すことに慣れていません。

ありがとうございます!

答えて

0

テンプレートタグは、ページのプレゼンテーションに関係するテンプレートですが、特定のプレゼンテーションとは独立したページデータの意味のあるプロパティです。私はあなたのページモデルの代わりにword_countをメソッドとして定義することをお勧めします - それはいつもpage.word_count()、または{{ page.word_count }}というテンプレートで利用可能です。ここでは、(ワードカウントを取得する陽気安価-と-方法として、スペースに分割str.split方法を、使用して)仕事ができる方法の例です:への簡単な方法の偉大例えば

class BlogPage(Page): 
    intro = RichTextField() 
    body = StreamField([ 
     ('heading', blocks.CharBlock()), 
     ('paragraph', blocks.RichTextBlock()), 
     ('image', ImageChooserBlock()), 
    ]) 

    def word_count(self): 
     count = len(self.intro.split()) 
     for block in self.body: 
      if block.block_type == 'paragraph': 
       count += len(str(block.value).split()) 

     return count 
+0

おかげで単語数を得る。これは動作しますが、リッチテキストフィールドの長さを取得しようとすると奇妙なエラーが発生します。 ''RichText'オブジェクトには 'split'という属性はありません リッチテキストフィールドを繰り返して、何らかの理由でヘッダーと段落を探すべきでしょうか? –

+0

ああ、申し訳ありません - そのエラーはStreamFieldのRichTextBlockから来ているようです。 'str(block.value)'を使って明示的に文字列に変換する必要があります。今更新されました... – gasman

+0

こんにちは、ありがとうございました!誰かが将来これを見て、私は@ gasmanのスクリプトにいくつかの行を追加して、素早く単語を数え、スクリプトを読む時間を作った。 'DEF単語数(自己): \t \t self.body内のブロックのカウント= 0 \t \t: \t \t \t block.block_type場合== '導入' \t \t \t \tカウント+ = LEN(ブロック。 value.split()) \t \t \t ELIFのblock.block_type == 'コンテンツ': \t \t \t \t数+ = LEN(STR(block.value).split()) \t \t self.count =カウント \t \t戻りカウント \t DEF reading_time(自己): \t \t単語= self.count \t \t速度= 225 \t \t時間= math.ceil(単語/速度) \t \t復帰時間 ' –

関連する問題