Wagtail:如何使用 RichTextField 来表示模型的字符串?

Wagtail: How do I use RichTextField for string representation of a model?

我目前正在处理这个片段

@register_snippet
class Foo(models.Model):
    body = RichTextField()

不知何故我决定我需要定义 __str__ 以便我可以区分多个片段。我相信使用 body 内容作为字符串表示可能是个好主意。虽然,body 可以变得非常大,所以前 20 个字符应该可以。

认为这个任务是小菜一碟,我写了这段代码:

@register_snippet
class Foo(models.Model):
    body = RichTextField() 

    def __str__(self):
        return self.body[:20]

... 这导致了丑陋的表示,例如 <p>Quequeueueueue?</<p>FOO<br/></p>.

我检查了数据库,发现标记存储在数据库中,这看起来很明显。虽然,我还在想。

在不使用 CPU-heavy HTML 解析器和解析整个 body 的情况下删除 HTML 标记的方法是什么?

我相信正则表达式可以删除 一些 标签,但我该如何处理 </a</blockqu<</?

没有安全转义的内置方法html。来自 docs-

1.8 版后已弃用removetags 不能保证 HTML 安全输出,并且出于安全考虑已被弃用。考虑改用漂白剂。

Bleach 是来自 Mozilla 的 html 清理库。在您的代码段 class 上创建一个方法可能是最有意义的,该方法 returns 一个漂白的字符串,删除所有标签。

此外,您可以使用built-in template tagstruncatewordstruncatechars等来限制模板渲染时显示的数量characters/words。

正如@Ian Price 在评论中所建议的那样,如果您可以信任您正在处理的内容,则正则表达式可以正常工作。例如:

import re

...

def __str__(self):
    remove_tags = re.compile('<.*?>')
    return re.sub(remove_tags, '', self.body)