2016-03-03 42 views
0

可以说,我的models.py看起来是这样的:如何获取可以在Django中迭代的ManyToManyField相关查询集?

class Tag(models.Model): 
    name = models.CharField(max_length=50) 

class Review(models.Model): 
    text = models.TextField() 
    tags = models.ManyToManyField(Tag, related_name='review_tags', blank=True) 

在我views.py我得到一个查询集是这样的:

def index(request): 
    reviews = Review.objects.all() 
    return render(request, 'myapp/index.html', {'reviews' : reviews}) 
的index.html

现在,我正在做这样的事情:

<div> 
    {% for review in reviews %} 
     <p>{{review.text}}</p> 
     {% for tag in review.tags %} 
      {{tag.name}} 
     {% endfor %} 
    {% endfor %} 
</div> 

显然,这是行不通的。但是,它会让您了解我正在尝试执行的操作,即获取特定审阅的标签并仅显示它们。我如何使用当前的设置执行此操作?

谢谢。

回答

4

我完全改写了答案,因为它得到upvotes和'接受答案',但是最初它是错误的。

所以正确的答案是呼叫{% for tag in review.tags.all %}遍历所有与Review对象循环相关的Tag对象。

ADITION:如果你想首先遍历虽然Tag对象,然后通过与Tag那么你需要有鉴于关系Review对象迭代,返回Tag对象。

def index(request): 
    tags = Tag.objects.all() 
    return render(request, 'index.html', {'tags': tags}) 

而且在模板中,你需要使用related_nameManyToManyField

{% for tag in tags %} 
    <p>{{tag.name}}</p> 
    {% for review in tag.review_tags.all %} 
     {{ review.text }} 
    {% endfor %} 
{% endfor %} 
+0

这并不是出于某种原因进行迭代。我尝试了{%for tag in review.review_tags.all%} {{tag.name}} {%endfor%},但没有显示任何内容。 –

+0

但是,{%for review.tags.all%中的标记}确实有效。谢谢。 –

+0

@TahmidKhanNafee谢谢你,我重新回答了答案,所以现在它有正确的信息。 –

相关问题