我想将 django 模型表示为 html 页面中的表,表标题与 django 字段名称相同。我怎样才能实现这个?

Shr*_*riP 3 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)
Run Code Online (Sandbox Code Playgroud)

对于这个模型,我想生成如下 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>
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Django 中实现这一目标?

Wil*_*sem 5

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

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})
Run Code Online (Sandbox Code Playgroud)

并作为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>
Run Code Online (Sandbox Code Playgroud)

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

编辑:使用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})
Run Code Online (Sandbox Code Playgroud)