Django模板中如何渲染模型TextField存储的HTML代码为实际元素
Django 实现TextField存储HTML渲染为页面元素方案
该需求完全可以实现,不需要更换其他字段类型,TextField已经可以满足存储需求,你遇到的输出问题是Django模板默认开启的HTML自动转义机制导致的。
Django为了避免XSS跨站脚本攻击,默认会把所有模板变量中的HTML标签做转义处理,所以你存的<h1>标签会被转义成纯文本输出,只需要针对性关闭对应字段的转义即可,有两种常用实现方案:
方案1:模板层加safe过滤器(灵活度高,推荐使用)
只需要在模板调用para_one字段的时候加上safe过滤器,告诉Django该内容是安全的不需要转义:
<!-- 模板调用示例 --> {{ movie.para_one|safe }}
设置后你存入的<h1>Hello World</h1>就会被渲染为一级标题格式的内容,不会显示HTML标签。
方案2:模型层预标记安全内容(适合全场景渲染HTML的情况)
如果这个字段在所有调用位置都需要渲染为HTML,你可以直接在模型层完成安全标记,后续调用不需要再加过滤器:
首先导入安全标记工具:
from django.utils.safestring import mark_safe
在你现有的Movie模型中新增自定义属性:
class Movie(models.Model): # 原有所有字段保持不变 para_one = models.TextField(blank=True) # 其他原有字段... @property def rendered_para_one(self): return mark_safe(self.para_one)
后续模板直接调用该属性即可:
{{ movie.rendered_para_one }}
安全注意事项
如果para_one字段的内容允许普通用户提交修改,请不要直接使用上述方案,否则会有严重的XSS攻击风险,你需要在保存内容前先对HTML做过滤,移除<script>、<iframe>等恶意标签后再存入数据库。
内容的提问来源于stack exchange,提问作者Shreyash mishra
相关产品推荐
相关产品推荐

