Django从1.5.1迁移到3.2后render_to_string HTML转义异常
解决Django 3.2 Admin中render_to_string生成HTML被转义的问题
在Django 3.2中,Admin默认会对字符串类型的字段输出进行HTML转义,而render_to_string返回的是普通字符串,因此会被转义成原始代码。以下是具体的解决方法:
核心方案:返回安全HTML对象
使用mark_safe将render_to_string的结果标记为安全HTML,同时配合format_html安全拼接片段,避免手动拼接带来的转义问题:
from django.utils.safestring import mark_safe from django.template.loader import render_to_string from django.utils.html import format_html class YourModelAdmin(admin.ModelAdmin): def roleMemberships(self, obj): html_fragments = [] # 遍历生成每个成员的HTML片段 for membership in obj.role_memberships.all(): rendered_html = render_to_string('common/contact.html', {'contact': membership.contact}) html_fragments.append(mark_safe(rendered_html)) # 用<br>分隔所有片段并返回 return format_html('<br>'.join(html_fragments))
排查之前format_html失效的原因
如果之前尝试format_html未成功,大概率是用法错误:
- 错误用法:直接将完整HTML字符串传入
format_html,它会自动转义其中的特殊字符:# 错误:会转义HTML标签 return format_html(rendered_html) - 正确用法:通过占位符传递已标记为安全的内容,或直接用
mark_safe包裹后返回:# 正确方式1 return format_html('{}', mark_safe(rendered_html)) # 正确方式2 return mark_safe(rendered_html)
废弃配置清理
如果旧代码中使用了allow_tags(Django 1.9后已废弃),请移除该配置,改用mark_safe:
# 移除这种废弃写法 # roleMemberships.allow_tags = True
模板侧验证
确认common/contact.html模板中没有手动添加转义逻辑,比如避免使用{{ contact.field|escape }}这类强制转义的过滤器,确保模板输出的是预期的HTML代码。
内容的提问来源于stack exchange,提问作者Bryan Teague
相关产品推荐
相关产品推荐

