Django模板按指定字段嵌套遍历模型数据的实现问题
解决Django模板动态访问模型字段的问题
问题原因
Django模板的点语法不支持动态拼接属性名,{{test}}.{{f}}会被直接渲染成「实例字符串.字段名」的文本,而不是实际访问模型实例的对应字段值。另外你当前模板的<tr>标签位置错误,所有数据会被放在同一行里,需要调整循环结构。
解决方案一:视图层预处理数据
在视图中提前提取每个模型实例的指定字段值,整理成字典列表后传给模板,这样模板可以直接通过键访问值:
修改视图代码:
def test_home(request): verbose = Test().get_all_fields_verbose() fields = Test().get_all_fields_names() test_list = Test.objects.all().order_by('-created_at') # 预处理数据,提取每个实例的指定字段值 processed_tests = [ {field: getattr(test, field) for field in fields} for test in test_list ] system1= System0.objects.all() form = TestForm() items=len(verbose) context = { "processed_tests": processed_tests, "systems": system1, "form": form, "items": items, "verbose": verbose, "fields": fields } return render(request, 'test_simple_home.html', context )
修改模板代码:
<table class="table table-bordered" id="example" style="text-align: center; font-size: 14px;"> <thead class="table-success"> <tr> {% for verb in verbose %} <th>{{ verb }}</th> {% endfor %} </tr> </thead> <tbody> {% for test_data in processed_tests %} <tr> {% for f in fields %} <td class="body-table" style="padding: 1px;">{{ test_data.f }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table>
解决方案二:自定义模板过滤器
通过自定义过滤器实现动态获取模型实例的属性,适合不想修改视图逻辑的场景:
- 在你的Django应用下创建
templatetags目录,新建__init__.py和custom_filters.py文件,custom_filters.py内容:
from django import template register = template.Library() @register.filter def get_attr(obj, attr_name): # 第二个参数是默认值,避免字段不存在时报错 return getattr(obj, attr_name, '')
- 在模板开头加载过滤器:
{% load custom_filters %}
- 修改模板中的字段访问部分,同时修正
<tr>的位置:
<table class="table table-bordered" id="example" style="text-align: center; font-size: 14px;"> <thead class="table-success"> <tr> {% for verb in verbose %} <th>{{ verb }}</th> {% endfor %} </tr> </thead> <tbody> {% for test in tests %} <tr> {% for f in fields %} <td class="body-table" style="padding: 1px;">{{ test|get_attr:f }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table>
注意事项
- 确保你的
get_all_fields_names()方法返回的是模型字段的准确名称(和模型类中定义的一致) - 如果字段涉及外键或关联对象,
getattr(test, field)会返回关联模型实例,可根据需求进一步处理(比如取__str__值或关联字段)
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

