这是我的问题: 我想在模板中打印一个表格,其中包含每个字段的每个对象
这是我的解决方案:
views.py
def start(request):
all_rows = Person.objects.all()
all_fields_names = Person._meta.get_fields()
content = { 'all_rows': all_rows,
'all_fields_names': all_fields_names }
return render(request, 'start.html', content)
的start.html
<table class="table table-striped table-hover table-responsive">
<thead>
{% for names in all_fields_names %}<th>{{ names.name |title }}</th>{% endfor %}
</thead>
<tbody>
{% for row in all_rows %}
<tr>
<td>{{ row.name }}</td>
<td>{{ row.yabadiba }}</td>
<td>{{ row.value1 }}</td>
<td>{{ row.value2 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
一切都很完美。问题是,当我不确切地知道班级中有多少个字段时。其次,我的解决方案打破了DRY规则。我试过了:
getattr(行,名称)
和嵌套循环,但没有成功。 有没有简单的解决方案?
此外:如何为每个班级打印这样的视图?
答案 0 :(得分:1)
您需要的是views
中的values_list查询,它会在迭代时返回元组。每个元组都包含传递到values_list()
的相应字段或表达式中的值:
all_fields_names = Mileage._meta.get_fields()
value_fields = [f.name for f in all_fields_names]
all_rows = Mileage.objects.values_list(*(value_fields)) #pass fields to value_list
然后您可以在templates
:
{% for row in all_rows %}
<tr>{% for value in row %}<td>{{ value }}</td>{% endfor %}</tr>
{% endfor %}