我有两个模型如下:
class Tag(models.Model):
# ...
class Paragraph(models.Model):
tags = models.ManyToManyField(Tag)
# ...
在模板内部,我正在使用Paragraph
标记迭代{% for %}
个对象的查询集以显示它们。我还需要显示相关标签,但前提是它们与之前的迭代不同。
这意味着如果我渲染5个段落的列表,并且前四个具有相同的标签,但第五个具有不同的标签,我想仅通过第一段和第五段显示标签。
我尝试使用{% ifchanged %}
内置代码,但正如我所知,我无法使用{% ifchanged paragraph.tags.all %}
因为它始终会返回True
,即使paragraph.tags.all
包含相同的元素。
因此,我考虑在{% iftagschanged %}
标记的基础上使用自定义模板标记{% ifchanged %}
,但使用不同的比较方法,比较查询集本身的查询集内容,这些内容始终不匹配。
问题是,当我看到{% ifchanged %}
tag in django source时,它看起来有点复杂,我无法找到,如何改变它以便在我的情况下正常工作。
所以我会感谢您的建议,或者对任何不同解决方案的想法。
答案 0 :(得分:1)
在Paragraph模型上创建一个自定义方法,该方法在数据结构中返回其关联的标签,这些标签可以轻松比较 - 例如,一组 - 并将其用作ifchanged的参数。
class Paragraph(models.Model):
def tags_as_set(self):
return set(t.tag for t in self.tags.all())
{% ifchanged paragraph.tags_as_set %}