Django模板forloop.counter0|divisibleby:3判断失效 3列表格布局错乱
问题根因
布局全乱是几个低级错误叠加逻辑漏洞导致的,和divisibleby过滤器本身没有关系:
- 标签写反:初始代码里本该写
</tr>闭合行的位置,写的是开标签<tr>,浏览器解析表格DOM的时候直接把结构冲烂了 - 间隔列重复渲染:你给spacer列加了
forloop.counter < 3的判断,等于循环前三次每次都插一个间隔列。要知道rowspan="0"的语义是从当前行开始跨表格所有剩余行,只需要渲染1次就够了,插3次直接让第一行多了2个多余列,整个表格列数完全对不上 - 计数逻辑混乱:一会儿用从1开始计数的
forloop.counter,一会儿用从0开始计数的forloop.counter0做整除判断,换行时机完全偏移,也没处理最后一行凑不够3个单元格的补位,表格结构天生残缺
你后面调整的版本出现空白、内容重复的问题,本质还是间隔列重复插入、硬塞空td没绑定对应数据导致的。
可直接复用的实现代码
不需要修改视图层逻辑,直接替换模板里的表格代码即可:
<table> <tr> {% for job in jobsite %} <td> {{ job.name }}<br/> {{ job.address }}<br/> {% if job.address_2 %}{{ job.address_2 }}<br/>{% endif %} {{ job.city }}, {{ job.state }} {{ job.zip }} </td> {# 间隔列只在第一个单元格后渲染1次,自动跨表格所有行 #} {% if forloop.first %} <td class="spacer" rowspan="0"> </td> {% endif %} {# 每凑够3个业务单元格,且不是最后一条数据时,自动换行 #} {% if forloop.counter0|add:1|divisibleby:3 and not forloop.last %} </tr><tr> {% endif %} {% endfor %} {# 最后一行凑不够3个单元格时自动补空td,保证结构对齐 #} {% with total=jobsite|length %} {% if total|add:"2"|divisibleby:3 %} <td></td> {% elif total|add:"1"|divisibleby:3 %} <td></td><td></td> {% endif %} {% endwith %} </tr> </table>
逻辑说明
- 间隔列仅渲染1次,不会生成冗余列打乱布局
- 计数逻辑统一,每3个单元格自动换行,不会出现行偏移问题
- 自动判断最后一行缺几个单元格就补几个空td,不管总数据量是不是3的倍数,表格结构始终完整,适配Avery打印模板的对齐要求,不会出现内容重复、布局错位的问题
内容的提问来源于stack exchange,提问作者beach_it
相关产品推荐
相关产品推荐

