如何在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
相关产品推荐
相关产品推荐

