Django渲染formset表格时设置首行标签、列宽及序号列的实现问题
代码调整方案
1. 修改模板文件 linprog.html 代码
替换原有table部分的代码如下:
<table> {{ formset.management_form }} <!-- 表头部分,对应需求1:打印字段标签到第一行 --> <thead> <tr> <th style="width:45px;">V</th> {% for field in formset.empty_form %} <!-- 按需求设置对应对齐方式 --> {% if field.name == 'x1' %} <th style="width:45px;text-align:left;">{{ field.label }}</th> {% elif field.name == 'x2' or field.name == 'direct' %} <th style="width:45px;text-align:center;">{{ field.label }}</th> {% elif field.name == 'rhs' %} <th style="width:45px;text-align:right;">{{ field.label }}</th> {% endif %} {% endfor %} </tr> </thead> <tbody> {% for form in formset %} <tr> <!-- 序号列,对应需求3:生成C1、C2...格式的序号 --> <td style="width:45px;">C{{ forloop.counter }}</td> {% for field in form %} <!-- 宽度统一设置为45px,对应需求2,同时设置对应对齐方式 --> {% if field.name == 'x1' %} <td style="width:45px;text-align:left;">{{ field }}</td> {% elif field.name == 'x2' or field.name == 'direct' %} <td style="width:45px;text-align:center;">{{ field }} <!-- 原有针对direct字段的逻辑可放在此处 --> </td> {% elif field.name == 'rhs' %} <td style="width:45px;text-align:right;">{{ field }}</td> {% endif %} {% endfor %} </tr> {% endfor %} </tbody> </table>
代码说明:
- 新增
<thead>标签渲染表头,通过formset.empty_form获取表单字段的标签,实现字段标签在第一行展示的需求 - 所有单元格的width属性统一设置为45px,满足字段宽度要求
- 通过
forloop.counter获取当前行的循环序号,拼接前缀C生成指定格式的序号列 - 新增
formset.management_form是Django formset的必填内容,避免表单提交时出错 - 你原有针对direct字段的特殊处理逻辑,可直接放在对应字段的判断分支中
2. 修改forms.py代码(可选,匹配预期表头的RHS大写格式)
class linprog_vars(forms.Form): x1 = forms.FloatField(label='x1') x2 = forms.FloatField(label='x2') direct = forms.CharField(label='direct') rhs = forms.FloatField(label='RHS')
这里仅修改了rhs字段的label为大写RHS,和你提供的预期效果表头保持一致,不需要可以不调整。
3. views.py无需修改
原有逻辑可以正常运行,无需额外调整。
内容的提问来源于stack exchange,提问作者Andrey Vinajera
相关产品推荐
相关产品推荐

