如何在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
相关产品推荐
相关产品推荐

