【问题标题】:How can I display a Django model in a Django template?如何在 Django 模板中显示 Django 模型?
【发布时间】:2017-11-13 07:27:38
【问题描述】:
试图弄清楚 Django... 我想在模板中构建一个表,该表主要是来自 Django 模型的所有数据。我的偏好是将模型查询集PersonDynamic.objects.all() 发送到模板并让它找出列名,然后遍历每一行,为该行添加字段。这种方法会给我很大的灵活性,因为如果模型发生变化,模板会自动随之变化。
一种方法可能是将列标题和每条记录移动到列表中,然后我将其发送到模板,但这似乎比仅发送查询集效率低。
- 最好的方法是什么?
- 我对效率的看法是否正确?
- 如果有大量记录,发送列表而不是模型实例是否会带来更大的问题风险,或者无论采用哪种方法都存在这种风险?
谢谢!
【问题讨论】:
标签:
django
django-models
django-templates
【解决方案1】:
尝试查看django.contrib.admin 的代码,以及内置管理站点如何制作表格。管理站点添加了许多额外的功能来更改字段的显示方式以及要显示的字段,但它应该让您对事情的工作方式有所了解。
我能想到的最简单的方法是向模板发送您要使用的标题列表,并使用values_list 方法调用查询集。 values_list 采用一系列字段名称,并返回另一个查询集,该查询集将产生一个字段值元组而不是模型对象。例如,假设您的 PersonDynamic 如下所示:
class PersonDynamic(Model):
id = AutoField()
name = CharField()
likes_python = BooleanField()
然后您可以将这样的内容发送到您的模板:
fields = ['id', 'name', 'likes_python']
qs = PersonDynamic.objects.values_list(*fields)
context = Context({'headers': fields, 'rows': qs})
template.render(context)
你的模板可以这样做:
<table>
<tr>{% for item in header %}<th>{{ item }}</th>{% endfor %}</tr>
{% for row in rows %}
<tr>{% for cell in row %}<td>{{ cell }}</td>{% endfor %}</tr>
{% endfor %}
</table>
对于您的其他问题,这将遇到较大表的问题;像这样遍历大型列表需要时间和内存,因此通常使用分页之类的策略,每页仅显示 X 项。