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

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>

解决方案二:自定义模板过滤器

通过自定义过滤器实现动态获取模型实例的属性,适合不想修改视图逻辑的场景:

  1. 在你的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, '')
  1. 在模板开头加载过滤器:
{% load custom_filters %}
  1. 修改模板中的字段访问部分,同时修正<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:57:46