Django如何将TextField存储的HTML格式博客内容正常渲染到前端模板
解决方案
Django默认会自动转义模板输出的HTML字符,避免XSS注入风险,你可以通过以下几种方式实现自定义HTML内容的正常渲染:
方案1:使用模板safe过滤器(最简便)
直接在模板输出变量时添加safe过滤器,告知Django该内容是安全的无需转义,修改后的模板代码如下:
{% extends 'base.html' %} {% block content %} <h1>{{ blog.title }}</h1> <p>{{ blog.content|safe }}</p> {% endblock content %}
方案2:模型层标记内容为安全(无需重复修改模板)
如果多处需要渲染该字段内容,可以在模型层通过mark_safe方法预先标记字段为安全内容,修改models.py如下:
from django.utils.safestring import mark_safe class Blog(models.Model): title = models.CharField(max_length=100) content = models.TextField() date_created = models.DateField(auto_now_add=True) def __str__(self): return self.title # 新增返回安全HTML内容的方法 def rendered_content(self): return mark_safe(self.content)
之后模板中直接调用该方法即可,无需额外加过滤器:
<p>{{ blog.rendered_content }}</p>
安全注意事项
如果你的博客内容仅由你本人在后台录入,以上方案可以直接使用。如果存在普通用户提交内容的场景,直接渲染原生HTML会存在XSS攻击风险,建议先对HTML内容做标签过滤,仅保留<p>、<img>等安全标签后再渲染。
内容的提问来源于stack exchange,提问作者penk
相关产品推荐
相关产品推荐

