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

时间:2016-03-26 19:42:33

标签: python django wagtail

我目前正在处理此代码段

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

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

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

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

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

...导致丑陋的陈述,例如<p>Quequeueueueue?</<p>FOO<br/></p>

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

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

我相信正则表达式可以删除某些标记,但如何处理</a</blockqu<</等情况?

2 个答案:

答案 0 :(得分:1)

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

自1.8版以来已弃用removetags无法保证HTML安全输出,并且由于安全问题而被弃用。考虑使用漂白剂。

Bleach是来自Mozilla的html清理库。最有意义的是在您的代码段类上创建一个返回漂白字符串的方法,删除所有标记。

此外,您可以使用built-in template tags truncatewordstruncatechars等来限制模板渲染时显示的字符数/单词数。

答案 1 :(得分:0)

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

import re

...

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