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

Django模板中如何动态访问数据库表每行的各个属性?

解决Django模板动态访问记录属性的问题

问题核心在于Django模板的语法逻辑:record.field_name是直接尝试访问record对象中名为field_name的固定属性,而非用变量field_name的值作为属性名来动态取值。这就是表格行数匹配但内容为空的原因——你的模型里并没有field_name这个字段。

下面提供两种可行的解决方法:

方法一:使用attr模板过滤器(推荐,模板层直接处理)

Django内置的attr过滤器支持通过变量名动态获取对象属性,修改模板代码如下:

<tbody>
   {% for record in table_records %}
      <tr>
        {% for field in table_fields %}
           {% with field_name = field.name %}
              <td>{{ record|attr:field_name }}</td>
           {% endwith %}
        {% endfor %}
      </tr>
   {% endfor %}
</tbody>

record|attr:field_name会将field_name变量的实际值作为属性名,从record对象中取出对应的数据。

方法二:在视图中预处理数据(适合复杂业务场景)

如果需要对数据做额外加工,可以在视图函数中提前将每条记录的字段名与对应值整理成字典,再传递给模板:

# 视图函数示例
from django.shortcuts import render
from your_app.models import YourModel

def your_view(request):
    # 获取模型字段与数据库记录
    table_fields = YourModel._meta.get_fields()
    table_records = YourModel.objects.all()
    
    # 预处理记录为字典格式
    processed_records = []
    for record in table_records:
        record_dict = {}
        for field in table_fields:
            # 仅处理实际存储数据的字段,排除反向关联等特殊字段
            if field.concrete:
                record_dict[field.name] = getattr(record, field.name)
        processed_records.append(record_dict)
    
    return render(request, 'your_template.html', {
        'processed_records': processed_records,
        'table_fields': table_fields
    })

之后在模板中直接通过字典键取值:

<tbody>
   {% for record in processed_records %}
      <tr>
        {% for field in table_fields %}
           {% if field.concrete %}
              <td>{{ record[field.name] }}</td>
           {% endif %}
        {% endfor %}
      </tr>
   {% endfor %}
</tbody>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:02:37