You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:30:48