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

如何强制Django将模型字段中存储的模板变量值正确渲染为上下文对应值

实现方法

Django默认只会解析项目本地模板文件内的模板语法,存储在数据库中的字符串里的{{变量}}会被当成普通文本输出,你可以通过两种方式实现需求:

方法1:视图层预处理(推荐)

直接在视图中用Django原生模板引擎渲染数据库中取出的模板字符串,再传给前端模板:

# 视图内导入依赖
from django.template import Template, Context

# 你的视图逻辑
def your_view(request):
    # 从数据库读取存储的模板内容
    contract_obj = YourModel.objects.get(id=xxx)
    raw_template = contract_obj.contract_detail

    # 构造模板对象和允许的上下文变量(只传入你允许用户使用的变量,避免敏感数据泄露)
    tpl = Template(raw_template)
    render_context = Context({
        "first_name": "张三",
        # 其他允许用户调用的变量在此处添加
    })
    rendered_contract = tpl.render(render_context)

    # 传入模板渲染即可
    return render(request, "your_template.html", {"rendered_contract": rendered_contract})

模板内直接输出即可:

{% autoescape off %}
{{ rendered_contract }}
{% endautoescape %}

方法2:自定义模板标签(适合多处复用场景)

如果需要在多个模板中使用该能力,可以封装为自定义模板标签:

  1. 在你的APP下新建templatetags目录,目录内新增__init__.py(空文件即可)和custom_render.py,内容如下:
from django import template
from django.template import Template, Context

register = template.Library()

@register.simple_tag(takes_context=True)
def render_stored_template(context, stored_str):
    # 如需限制可用变量,可在这里手动构造Context白名单,不要直接传整个context避免数据泄露
    tpl = Template(stored_str)
    return tpl.render(context)
  1. 模板内使用:
{% load custom_render %}

{% autoescape off %}
    {% render_stored_template contract_detail %}
{% endautoescape %}

安全注意事项

由于你允许用户自定义HTML和模板语法,需注意风险防控:

  • 必须做变量白名单控制,不要直接传入全局上下文,防止用户通过模板语法访问到用户密码、系统配置等敏感数据
  • 如不需要支持{% %}类模板标签,可做语法过滤,禁止用户输入模板标签逻辑,仅保留{{变量}}替换能力,避免危险模板标签被执行
  • 做好XSS防护,可对用户输入的HTML做标签白名单过滤,避免用户插入恶意脚本

内容的提问来源于stack exchange,提问作者master_j02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:06:01