我需要使用 Django 显示数据库中的表。最明显的方法是手动输入表标题并循环查询结果model.objects.all()
。然而,由于很懒,我想自动执行此操作,即通过内省加载模型中的所有字段以显示为列标题,并加载所有字段值以显示为行。这种方法还可以为我节省一些时间,因为当我的模型发生变化时,我不必更新我的模板代码。我已经让它工作了,但有两个问题:
- 我找不到加载 AutoField 字段 (id) 值的方法,因此我必须切掉 ID 列。
- 该代码看起来相当混乱,尤其是使用随机模板标签时。
这是我的代码。请注意,代码工作正常,因此我将跳过所有导入,因为它们是正确的:
views.py我使用序列化器来序列化数据,这是我在 stackoverflow 上读到的一个技巧
def index(request):
fields = MyModel._meta.fields
data = serializers.serialize("python", MyModel.objects.all())
context_instance = RequestContext(request, {
'data' : data,
'fields' : fields,
})
return TemplateResponse(request, 'index.html', context_instance)
模板/index.html:请注意,我必须通过切掉字段列表的第一个元素来切掉 ID 列
{% with fields|slice:"1:" as cached_fields %}
<table>
<thead>
<tr>
{% for field in cached_fields %}
<th>{% get_verbose_name field %}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for instance in data %}
<tr>
{% for field in cached_fields %}
<td>{% get_value_from_key instance.fields field %}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endwith %}
模板标签/extra_tags.py
# tag to get field's verbose name in template
@register.simple_tag
def get_verbose_name(object):
return object.verbose_name
# tag to get the value of a field by name in template
@register.simple_tag
def get_value_from_key(object, key):
# is it necessary to check isinstance(object, dict) here?
return object[key.name]