【问题标题】:Display Word Count in Blog Post with Wagtail使用 Wagtail 在博客文章中显示字数
【发布时间】:2017-03-03 18:16:26
【问题描述】:

我想知道如何创建一个模板标签来获取 Wagtail 中整个博客文章的字数。我环顾四周,看到了一些使用 python 的不同方法,但不太确定如何使用 wagtail 来实现,因为视图通常被抽象掉。看起来查询也变得更加复杂,因为在许多情况下,创建者可能想要计算 wagtail 模板的多个部分(介绍、正文等)。

我注意到在管理员中也有 a nice package 为您执行此操作,但我想在用户端显示它。

我猜这是一个非常简单的答案,但我仍然不熟悉在没有视图的情况下将新变量传递给 Wagtail 中的模板。

谢谢!

【问题讨论】:

    标签: python django wagtail


    【解决方案1】:

    模板标签在这里不是最好的方法 - 模板与页面的呈现有关,但字数是页面数据的一个有意义的属性,它独立于任何特定的呈现。我建议将 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
    

    【讨论】:

    • 感谢您提供了一个简单的字数统计方法的好例子。这可行,但是在尝试获取富文本字段的长度时出现奇怪的错误。 'RichText' object has no attribute 'split'我应该遍历富文本字段以仅以某种方式查找标题和段落吗?
    • 啊,抱歉 - 看起来该错误来自 StreamField 中的 RichTextBlock。需要使用str(block.value) 将其显式转换为字符串。现已更新...
    • 嘿,非常感谢您的修复!以后看到这个的人,我在@gasman 的脚本中添加了几行,以便快速计算字数和阅读脚本的时间。 def word_count(self): count = 0 for block in self.body: if block.block_type == 'introduction': count += len(block.value.split()) elif block.block_type == 'content': count += len(str(block.value).split()) self.count = count return count def reading_time(self): words = self.count speed = 225 time = math.ceil(words/speed) return time
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 2018-01-10
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多