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

如何在Django模板中优雅地将大HTML代码块传入with变量?

优雅传递大段HTML到Django模板with变量的方案

方案一:自定义{% captureas %}标签(最直观)

这是最适合在模板内直接处理大段HTML的方案,不用手动转义任何内容,能保持代码的可读性和整洁度。

步骤1:编写自定义模板标签

在你的Django项目的templatetags目录下(没有的话直接新建)创建custom_tags.py,写入以下代码:

from django import template

register = template.Library()

@register.tag(name='captureas')
def do_captureas(parser, token):
    try:
        tag_name, varname = token.contents.split(None, 1)
    except ValueError:
        raise template.TemplateSyntaxError("%r标签需要指定变量名" % token.contents.split()[0])
    nodelist = parser.parse(('endcaptureas',))
    parser.delete_first_token()
    return CaptureasNode(nodelist, varname)

class CaptureasNode(template.Node):
    def __init__(self, nodelist, varname):
        self.nodelist = nodelist
        self.varname = varname

    def render(self, context):
        output = self.nodelist.render(context)
        context[self.varname] = output
        return ''

步骤2:在模板中使用

在需要传递HTML的模板顶部加载自定义标签,然后用{% captureas %}包裹大段HTML,再传给include:

{% load custom_tags %}

{% captureas info %}
<div class="card">
  <h3>这是大段HTML内容</h3>
  <p>包含引号"和换行,不需要手动转义</p>
  <a href="/detail">点击跳转</a>
</div>
{% endcaptureas %}

{% include "includes/template.html" with info=info %}

注意事项

在includes/template.html中渲染info时,要加上|safe过滤器,避免Django自动转义HTML标签:

{{ info|safe }}

方案二:用独立模板片段+自定义过滤器

如果这段大段HTML需要在多个地方复用,建议把它单独存为一个模板文件,再通过过滤器渲染成字符串传递。

步骤1:创建HTML片段模板

新建includes/big_info.html,写入你的大段HTML:

<div class="card">
  <h3>复用的大段HTML</h3>
  <p>内容...</p>
</div>

步骤2:编写渲染过滤器

在custom_tags.py中添加过滤器:

@register.filter
def render_template(template_path, context=None):
    from django.template.loader import render_to_string
    return render_to_string(template_path, context or {})

步骤3:在模板中使用

{% load custom_tags %}

{% include "includes/template.html" with info="includes/big_info.html"|render_template %}

方案三:视图层预处理

如果HTML内容是动态生成的,或者不想自定义模板标签,可以在视图中提前把HTML渲染成字符串,再传入模板上下文:

from django.shortcuts import render
from django.template.loader import render_to_string

def my_view(request):
    # 渲染HTML片段为字符串,可传入动态变量
    big_html_content = render_to_string('includes/big_info.html', {'username': request.user.username})
    return render(request, 'main.html', {'info': big_html_content})

然后在main.html中直接传递:

{% include "includes/template.html" with info=info %}

同样,子模板里要使用{{ info|safe }}来渲染HTML。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:42:42