You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中自动生成表格列标题,避免手动编写?

解决Django模板自动生成表格列名的问题

要实现自动生成表格列名,不用手动逐个编写<th>,可以通过传递模型字段信息到模板,再循环渲染的方式实现,以下是具体步骤:

1. 优化视图,传递需显示的字段信息

修改views.py,在get_context_data中添加要展示的字段列表(或者自动筛选排除不需要的字段),让模板能拿到这些字段名:

class ChoiceTableView(TemplateView):
    model = Question
    template_name = 'polls/table.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["qs"] = Choice.objects.all()
        # 方式1:手动指定要显示的字段,灵活可控
        context["display_fields"] = ["choice_text", "votes"]
        # 方式2:自动筛选排除不需要的字段(比如id、外键字段)
        # context["display_fields"] = [
        #     field.name for field in Choice._meta.fields 
        #     if field.name not in ["id", "question"]
        # ]
        return context

2. 给模型字段添加友好名称(可选)

如果希望表头显示更友好的名称而非字段名,修改models.py给字段添加verbose_name:

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200, verbose_name="Choice")
    votes = models.IntegerField(default=0, verbose_name="Votes")
    
    def __str__(self):
        return self.choice_text

3. 修改模板,循环渲染表头和内容

3.1 自定义模板过滤器(可选但推荐)

因为Django模板默认没有getattr过滤器,无法通过字段名动态获取对象属性,需要自定义一个:

在你的polls应用下创建templatetags目录,新建polls_tags.py文件:

from django import template

register = template.Library()

@register.filter
def getattr(obj, attr):
    return getattr(obj, attr)

3.2 编写模板代码

修改table.html,循环渲染表头和表格内容:

{% extends 'base.html'%}
{% load polls_tags %}  <!-- 加载自定义过滤器 -->

{% block content%} 
<div class="container">
    <div class="row">
      <p><h3 class="text-primary"> Python Django DataTables </h3></p>
      
<hr style="border-top:1px solid #000; clear:both;" />
<table id = "myTable" class ="table table-bordered">
    <thead class = "alert-warning"> 
        <tr>
            {% for field_name in display_fields %}
                <!-- 通过模型元数据获取友好名称 -->
                <th>{{ qs.model._meta.get_field(field_name).verbose_name }}</th>
            {% endfor %}
        </tr>
    </thead> 
    <tbody>
        {% for item in qs %} 
        <tr> 
            {% for field_name in display_fields %}
                {% if field_name == "choice_text" %}
                    <td contenteditable='true'>{{ item|getattr:field_name }}</td>
                {% else %}
                    <td>{{ item|getattr:field_name }}</td>
                {% endif %}
            {% endfor %}
        </tr>
        {% endfor %}
    </tbody>
</table>

{% endblock content%}

这样以后新增字段时,只需要在display_fields里添加字段名(或者调整自动筛选逻辑),模板就会自动渲染对应的表头和内容,不用手动修改<th>和<td>部分。

内容的提问来源于stack exchange,提问作者FrenchLasagna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:27:25