我目前正在处理此代码段
@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
,<
,</
等情况?
答案 0 :(得分:1)
没有内置的安全转义html的方法。来自docs -
自1.8版以来已弃用:
removetags
无法保证HTML安全输出,并且由于安全问题而被弃用。考虑使用漂白剂。
Bleach是来自Mozilla的html清理库。最有意义的是在您的代码段类上创建一个返回漂白字符串的方法,删除所有标记。
此外,您可以使用built-in template tags truncatewords
,truncatechars
等来限制模板渲染时显示的字符数/单词数。
答案 1 :(得分:0)
正如@Ian Price 在评论中所建议的那样,如果您可以信任您正在处理的内容,那么正则表达式就可以正常工作。例如:
import re
...
def __str__(self):
remove_tags = re.compile('<.*?>')
return re.sub(remove_tags, '', self.body)