如何在Django模板中显示Django模型?

时间:2017-06-11 21:28:15

标签: django django-models django-templates

试图弄清楚Django ......我想在模板中构建一个表,该表主要是来自Django模型的所有数据。我的偏好是将模型查询集PersonDynamic.objects.all()发送到模板,让它找出列名,然后遍历每一行,添加该行的字段。这种方法会给我很大的灵活性,因为如果模型发生变化,模板会自动随之改变。

一种方法可能是将列标题和每个记录移动到列表中,然后将其发送到模板,但这似乎比发送查询集效率低。

  • 这样做的最佳方式是什么?
  • 我的效率是对的吗?
  • 如果存在大量记录或者存在这种风险,发送列表而不是模型实例会带来更大的问题风险吗?

谢谢!

1 个答案:

答案 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个项目。