Django中获取ManyToManyField元素索引并执行操作的问题
解决Django模板中ManyToManyField作者列表的逗号分隔问题
你的代码主要存在两个问题:一是模板语法错误(嵌套变量写法不被支持),二是逻辑上误引用了关联对象的计数而非作者数量。下面给你两种简单可行的解决方法:
方法一:利用Django循环自带的forloop.last变量(推荐)
这是最简洁的实现方式,无需额外依赖过滤器,直接用模板内置循环变量判断是否为最后一个元素:
{% for article in articles %} <a href="{{ article.get_absolute_url }}">{{ article.article_title }} - {% for author in article.article_author.all %} {{ author }} {% if not forloop.last %}, {% endif %} {% endfor %} </a> {% endfor %}
forloop.last是Django模板循环的内置变量,当循环到最后一个作者时会返回True,我们只需要在非最后一位作者的名称后添加逗号即可。
方法二:通过索引判断(适合特殊场景)
如果需要基于索引实现逻辑,可以先缓存作者总数,再用循环索引与总数减1的值对比:
{% load mathfilters %} {% for article in articles %} {% with author_total=article.article_author.all.count %} <a href="{{ article.get_absolute_url }}">{{ article.article_title }} - {% for author in article.article_author.all %} {{ author }} {% if forloop.counter0 != author_total|sub:1 %}, {% endif %} {% endfor %} </a> {% endwith %} {% endfor %}
- 用
{% with %}标签缓存作者总数,避免重复查询数据库 forloop.counter0是从0开始的循环索引,和author_total|sub:1(总数减1)对比,不等于则添加逗号
原代码的错误说明
- 模板语法错误:Django模板不支持
article.article_author.all.{{article.article_author.all.answer_set.count|sub:1}}这种嵌套变量的写法,无法正确解析索引 - 逻辑错误:你需要的是作者列表的数量
article.article_author.all.count,而非answer_set.count(这是关联的回答对象数量)
内容的提问来源于stack exchange,提问作者War Tinder
相关产品推荐
相关产品推荐

