试图弄清楚Django ......我想在模板中构建一个表,该表主要是来自Django模型的所有数据。我的偏好是将模型查询集PersonDynamic.objects.all()
发送到模板,让它找出列名,然后遍历每一行,添加该行的字段。这种方法会给我很大的灵活性,因为如果模型发生变化,模板会自动随之改变。
一种方法可能是将列标题和每个记录移动到列表中,然后将其发送到模板,但这似乎比发送查询集效率低。
谢谢!
答案 0 :(得分: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个项目。