Django - 包含模型'table'的模板

时间:2017-07-01 00:03:04

标签: python django

这是我的问题: 我想在模板中打印一个表格,其中包含每个字段的每个对象

这是我的解决方案:

  

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(行,名称)

和嵌套循环,但没有成功。 有没有简单的解决方案?

此外:如何为每个班级打印这样的视图?

1 个答案:

答案 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循环
{% for row in all_rows %}
    <tr>{% for value in row %}<td>{{ value }}</td>{% endfor %}</tr>
{% endfor %}