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

如何在Django中编写可复用模板片段简化重复表头代码?

Django模板中复用重复HTML片段的方案

你想要的在模板端实现类似“函数”的代码复用,完全可以通过Django的自定义模板标签或者模板包含(include)+变量传递来实现,两种方案都能让你在模板里直接控制字段顺序,不用依赖视图层处理:

方案一:自定义Simple Tag(最接近你要的“函数”机制)

步骤1:创建自定义标签文件

在你的Django应用下新建templatetags目录,里面创建两个文件:

  • __init__.py(空文件即可,让Python识别为包)
  • custom_tags.py(编写自定义标签逻辑)

步骤2:编写标签代码

在custom_tags.py中加入以下代码:

from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def render_sortable_th(context, field_name):
    # 从上下文获取模板里的objForm和query_transform
    obj_form = context['objForm']
    query_transform_func = context['query_transform']
    
    # 获取字段的label标签
    field_label = obj_form[field_name].label_tag()
    # 生成排序链接的查询参数
    sort_query = query_transform_func(order_by=field_name)
    
    # 返回拼接好的HTML片段
    return f'''<th class="column-title">
        <a href="?{sort_query}">
            {field_label}
        </a>
    </th>'''

步骤3:在模板中使用

先加载自定义标签库,然后直接调用标签:

{% load custom_tags %}

{% render_sortable_th "x" %}
{% render_sortable_th "y" %}
{% render_sortable_th "z" %}

方案二:Include模板片段+变量传递

步骤1:创建复用的模板片段

新建sortable_th.html模板文件,内容如下:

<th class="column-title">
    <a href="?{% query_transform order_by=field_name %}">
        {{ objForm|get_item:field_name|label_tag }}
    </a>
</th>

步骤2:添加辅助过滤器

因为Django模板无法直接通过objForm[field_name]的方式获取字段,需要自定义一个get_item过滤器,在custom_tags.py中添加:

@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

步骤3:在主模板中引用

加载标签库后,通过include传递字段名变量:

{% load custom_tags %}

{% include "sortable_th.html" with field_name="x" %}
{% include "sortable_th.html" with field_name="y" %}
{% include "sortable_th.html" with field_name="z" %}

两种方案都能实现你要的效果,并且完全在模板端控制字段的渲染顺序,不需要在视图层提前准备字段列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:45:29