我想将django模型表示为html页中的表,表标题与django字段名称相同。我该如何实施?

时间:2018-07-10 12:07:51

标签: python django html-table

我是Django的新手。我陷入了一个问题,我觉得这超出了我目前在Django中的能力。 问题在于表列的标题与其相对模型字段的字符串表示形式相同。要进一步了解这一点, 假设我有一个如下模型:

class Car(models.Model):
   company_name = models.ForeignKey(Company,related_name='cars')
   transmission_type = models.CharField(max_length=50)
   color = models.CharField(max_length=25)
   age = models.PositiveIntegerField(blank=True,null=True)

对于此模型,我要生成如下的HTML表:

<table>
   <thead>
       <th>Company Name</th>
       <th>Transmission Type</th>
       <th>Color</th>
       <th>Age</th>
   </thead>
   <tbody>
       <tr>
           <td>{{company_name}}</td>
           <td>{{transmission_type}}</td>
           <td>{{color}}</td>
           <td>{{age}}</td>
       </tr>
   </tbody>
</table>

如何在Django中实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以在视图中执行最重要的处理部分。例如:

def some_view(request):
    model = Car
    field_names = [f.name for f in model._meta.get_fields()]
    data = [[getattr(ins, name) for name in field_names]
            for ins in Model.objects.prefetch_related().all()]
    return render(request, 'some_template.html', {'field_names': field_names, 'data': data})

并以some_template.html的形式出现:

<table>
    <thead>
    {% for head in field_names %}
       <th>{{ head }}</th>
    {% endfor %}
    </thead>
    <tbody>
    {% for row in data %}
        <tr>
        {% for cell in row %}
            <td>{{ cell }}</td>
        {% endfor %}
        </tr>
    {% endfor %}
    </tbody>
</table>

因此,我们为每个字段名称和每个模型实例构建一个二维表。然后,我们将这些数据呈现在包含<table>逻辑的HTML模板中。

编辑:使用verbose_name。由于字段名称有时有些含糊,因此我们也可以使用字段的verbose_name

def some_view(request):
    model = Car
    field_names = list(model._meta.get_fields())
    titles = [f.verbose_name for f in field_names]
    field_Names = [f.name for f in field_names]
    data = [[getattr(ins, name) for name in field_names]
            for ins in Model.objects.prefetch_related().all()]
    return render(request, 'some_template.html', {'field_names': titles, 'data': data})