我想知道如何创建一个模板标签,它将获得Wagtail中整个博客文章的单词计数。我已经环顾四周,看到了一些与python有关的不同方法,但不太确定如何使用wagtail这样做,因为视图经常被抽象掉。似乎查询也变得更加复杂,因为在许多情况下,创建者可能想要计算的wagtail模板(intro,body等)可能有多个部分。
我注意到还有a nice package在您的管理员中执行此操作,但我想在用户端显示它。
我猜这是一个非常简单的答案,但我仍然不熟悉在没有视图的情况下将新变量传递给Wagtail中的模板。
谢谢!
答案 0 :(得分: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