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

Django模板中变量键括号语法报错,如何实现动态表格渲染?

Django动态渲染表格:模板中无法通过变量字段名访问模型实例属性的解决办法

问题原因

  • Django模板语法不支持用括号进行变量索引/键值访问,所以{{ table[column] }}会触发解析报错。
  • 你通过Model.objects.raw()获取的query_set里的每个table是模型实例对象,不是普通Python字典,因此不存在.items属性,遍历自然无内容输出。

解决办法

方法1:视图中将模型实例转为字典传递

把raw查询返回的模型实例转换成字典,模板即可正常通过键访问字段值。修改视图代码:

from django.forms.models import model_to_dict

def index(request):
    cur_user = request.user
    Model = get_model(query.table)
    columns = get_table_columns(query.table)

    # 处理SQL查询逻辑...

    query_set = Model.objects.raw(query_string)
    # 将每个模型实例转换为字典
    query_set_dicts = [model_to_dict(item) for item in query_set]

    context = {
        'columns': columns,
        'cur_user': cur_user,
        'query_set': query_set_dicts  # 传递字典列表到模板
    }
    return render(request, 'flight_deck/index.html', context)

模板可使用最初的写法:

<tbody>
    {% for table in query_set %}
    <tr>
        {% for column in columns %}
            <td>{{ table[column] }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</tbody>

也可以遍历字典的键值对:

<tbody>
    {% for table in query_set %}
    <tr>
        {% for key, value in table.items %}
            <td>{{ value }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</tbody>

方法2:自定义模板标签实现属性访问

如果不想转换字典,可编写自定义模板标签,通过变量字段名直接获取模型实例的属性。

  1. 在你的app目录下创建templatetags文件夹,新建custom_tags.py和__init__.py文件:
# app/templatetags/custom_tags.py
from django import template

register = template.Library()

@register.simple_tag
def get_instance_attr(instance, attr_name):
    # 若属性不存在则返回空字符串
    return getattr(instance, attr_name, '')
  1. 在模板开头加载自定义标签:
{% load custom_tags %}
  1. 在模板中使用标签获取属性:
<tbody>
    {% for table in query_set %}
    <tr>
        {% for column in columns %}
            <td>{% get_instance_attr table column %}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</tbody>

方法3:自定义属性过滤器(简洁版)

写一个简单的模板过滤器,实现和标签类似的功能:

# app/templatetags/custom_tags.py
from django import template

register = template.Library()

@register.filter
def attr(obj, attr_name):
    return getattr(obj, attr_name, '')

模板加载后直接使用:

{% load custom_tags %}
<tbody>
    {% for table in query_set %}
    <tr>
        {% for column in columns %}
            <td>{{ table|attr:column }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</tbody>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:55:16