如何将数据库中的HTML代码正确渲染到Django模板?解决DTL变量渲染时显示原始HTML标签问题
解决Django模板中HTML代码不渲染的问题
你遇到的是Django默认的HTML转义机制导致的问题——Django为了防范XSS攻击,会自动把模板变量里的HTML标签转义成纯文本,所以页面上就显示原始标签而非渲染后的效果了。
快速修复方案
在模板中输出HTML内容的变量后添加|safe过滤器,明确告诉Django这段内容是安全的,可以直接渲染:
修改你的模板代码如下:
<a href="#"><img src="/media/company_images/{{ vacancy.company.logo }}" width="130" height="80" alt=""></a> <div class="d-flex align-items-baseline align-content-baseline"> <h1 class="h2 mt-4 font-weight-bold" >{{ vacancy.title }}</h1> <p class="m-0 pl-3">{{ vacancy.salary_min }}р – {{ vacancy.salary_max }}р</p> </div> <!-- 如果skills字段也存储了HTML格式内容,同样需要添加safe过滤器 --> <p class="mt-2">{{ vacancy.skills|safe }}</p> <p class="text-muted mb-4">Primal Assault (15-30 человек), Рязань или удаленно</p> <div style="line-height: 1.8;"> {{ vacancy.description|safe }} </div>
背后的原因
Django模板系统默认开启自动转义,会把<、>、&等特殊字符转换成对应的HTML实体(比如<会变成<),这样浏览器就会把它们当成纯文本解析,而非HTML标签。当你确认变量里的HTML内容是安全的(比如是后台手动录入的、经过审核的内容),就可以用|safe过滤器关闭该变量的转义。
安全注意事项
如果这些HTML内容来自用户提交的输入(比如用户填写的表单内容),直接使用|safe会存在XSS攻击风险。这种场景下建议使用bleach库清理HTML:
- 安装依赖:
pip install bleach - 在模板中使用
|bleach过滤器(需先在项目配置中注册该过滤器,或在视图层处理后再传递给模板),它会只保留你指定的安全标签和属性,兼顾渲染效果与安全性。
内容的提问来源于stack exchange,提问作者Malashenkov.ea
相关产品推荐
相关产品推荐

