Django:在一个循环中遍历模板中的多个连续ManyToMany关系

时间:2011-03-14 12:23:53

标签: django django-templates django-views

我有这样的情况:有三个Django模型,我们称之为文章,部分和标签,以及一个直通模型。

class Tag(models.Model):
    name = models.CharField(max_length=100, primary_key=True)

class Section(models.Model):
    # all sorts of fields here

class Article(models.Model):
    tags = models.ManyToManyField(Tag, null=True, blank=True)
    sections = models.ManyToManyField(Section, null=True, blank=True, through='SectionInArticle', related_name='articles')

class SectionInArticle(models.Model):
    article = models.ForeignKey(Article)
    section = models.ForeignKey(Section)
    order = models.IntegerField()

然后,在该部分的详细信息模板中,我想列出相关文章中的所有标签。为此,我首先必须反向遍历Section-Article ManyToMany关系(使用related_name),然后遍历Article-Tag ManyToMany关系。我试过这个:

{# doesn't print anything: #}
{% for tag in object.articles.tags.all %}
{{ tag.name }}
{% endfor %}

但由于某种原因,这不起作用。 {%for object.articles.all.tags.all%}中的标签也不起作用。我可以使用嵌套循环打印所有标签,但这意味着重复会成为一个问题。

{# duplicates are an issue here: #}
{% for article in object.articles.all %}
  {% for tag in article.tags.all %}
    {{ tag.name }}
  {% endfor %}
{% endfor %}

在Django模板中有没有一种巧妙的方法可以做到这一点,还是我必须把它放在视图代码中?如果是这样,在那里做最干净的方法是什么,这样我可以避免列表中的重复标签?

1 个答案:

答案 0 :(得分:4)

您正在寻找的过滤器基本上是:

Tag.objects.filter(article__sections=section)

您可以将其添加到视图中,也可以将其作为属性添加到Section模型中:

class Section(models.Model):
# all sorts of fields here
@property
def tags(self):
    return Tag.objects.filter(article__sections=self).all()

然后在模板中执行:

{% for tag in object.tags %}
    {{ tag.name }}
{% endfor %}