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:自定义模板标签实现属性访问
如果不想转换字典,可编写自定义模板标签,通过变量字段名直接获取模型实例的属性。
- 在你的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, '')
- 在模板开头加载自定义标签:
{% load custom_tags %}
- 在模板中使用标签获取属性:
<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
相关产品推荐
相关产品推荐

