3

我目前正在处理这个片段

@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 解析器和解析整体的情况下删除 HTML 标记的方法是什么body

我相信正则表达式可以删除一些标签,但是我该如何处理诸如</a, </blockqu, <,之类的情况</呢?

4

2 回答 2

1

没有内置的方法可以安全地转义 html。从文档-

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

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

此外,您可以使用内置的模板标签 truncatewordstruncatechars等来限制模板渲染时显示的字符/单词的数量。

于 2016-03-27T21:02:28.023 回答
0

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

import re

...

def __str__(self):
    remove_tags = re.compile('<.*?>')
    return re.sub(remove_tags, '', self.body)
于 2021-06-01T10:32:00.427 回答