模板内部的Queryset比较,可能使用{%ifchanged%}标签的自定义版本

时间:2011-06-21 16:33:54

标签: django django-templates

我有两个模型如下:

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时,它看起来有点复杂,我无法找到,如何改变它以便在我的情况下正常工作。

所以我会感谢您的建议,或者对任何不同解决方案的想法。

1 个答案:

答案 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 %}