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

如何在未知对象属性的情况下构建Django动态数据表格?

实现Django动态通用表格(无需为每个模型单独写视图)

完全可以实现通用的动态表格,不需要为每个模型单独创建视图,只需要调整模板逻辑并配合简单的辅助处理即可解决问题。

问题核心

你当前的视图已经正确获取了模型的字段(表头)和数据集合,但模板中仅输出了对象本身({{obj}}),没有遍历每个字段对应的值。

解决方案

1. 优化视图(可选,过滤不必要字段)

现有视图已能获取表头,但get_fields会返回所有字段(包括关联字段),可过滤掉非直接显示的字段(比如关联字段、反向关联等),避免模板显示异常:

table = tenant_tables.models[table_name].objects.all()
# 过滤出可直接显示的实体字段
headers = [field for field in table.model._meta.get_fields(include_parents=True, include_hidden=False) 
           if field.concrete and not field.is_relation]
context = {'table': table, 'headers': headers}
return render(request, template_name=template_name, context=context)

2. 自定义模板过滤器(获取对象字段值)

Django模板默认没有直接按字段名获取对象属性的过滤器,需自定义一个getattr过滤器:
在你的app目录下创建templatetags文件夹,添加__init__.py和custom_filters.py文件,内容如下:

# custom_filters.py
from django import template

register = template.Library()

@register.filter
def getattr(obj, attr):
    try:
        return getattr(obj, attr)
    except AttributeError:
        return ''

3. 修改模板遍历字段值

在模板开头加载自定义过滤器,然后遍历每个表头字段,通过过滤器获取对象对应的值:

{% load custom_filters %}

<table
    id="example"
    class="table table-striped data-table"
    style="width: 100%"
>
    <thead>
        <tr>
            {% for header in headers %}
            <th>{{ header.verbose_name }}</th>
            {% endfor %}
        </tr>
    </thead>
    <tbody>
        {% for obj in table %}
        <tr>
            {% for header in headers %}
            <td>{{ obj|getattr:header.name }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </tbody>
    <tfoot>
        <tr>
            {% for header in headers %}
            <th>{{ header.verbose_name }}</th>
            {% endfor %}
        </tr>
    </tfoot>
</table>

额外说明

  • 如果需要显示关联字段(如外键),可修改过滤器逻辑,比如返回getattr(obj, attr).name(需根据关联模型的实际字段调整)。
  • 该方案可适配任意模型,完全实现通用表格的复用,无需为每个模型单独编写视图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:45:36