我需要用 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)
template/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]