2017-03-03 47 views
0

我想知道如何創建一個模板標籤,可以在W get中獲取整個博客文章的字數。我環顧四周,看到了一些與python有關的不同方式,但不太清楚如何通過w do來做到這一點。看起來查詢也變得更加複雜,因爲在許多情況下,創建者可能需要計算一個w template模板(介紹,正文等)的多個部分。在Blog Display博客文章中顯示字數問題

我注意到,也有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 word_count中(個體): \t \t計數= 0 \t \t用於塊中self.body: \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返回時間 –

相關問題