如何在Django中访问多对多属性

时间:2013-05-23 17:10:48

标签: python django many-to-many

我是Web开发的新手,我使用Django创建了一个示例项目。到目前为止,我有一个Django支持的页面,显示我的一个数据库模型对象的内容,称为Publications。我在视图模板中的代码是:

<html><head><title>Publications</title></head>
<body>
<h1>Publications</h1>
<ul>
{% for publication in publication_list %}
<li>{{ publication.title }} </li>
{% endfor %}
</ul>
</body></html>

这很好用,但现在我想访问并显示名为Tags的Publications上的多对多属性。我尝试添加另一个标签,如下所示:

<html><head><title>Publications</title></head>
<body>
<h1>Publications</h1>
<ul>
{% for publication in publication_list %}
<li>{{ publication.title }} </li>
{% for tag in publication_list.tags %}
<li>{{ tag.title }} </li>
{% endfor %}
{% endfor %}
</ul>
</body></html>

我意识到这是非常错误的,但我没有看到如何访问Tags模型。作为参考,我在视图中显示出版物的功能是:

def display_publications(request):
    publication_list = Publication.objects.order_by('title')[:10]
    return render(request, 'publications.html', {'publication_list': publication_list})

我的出版物和标签模型是:

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

class Publication(models.Model):
    title = models.CharField(max_length=200)
    tags = models.ManyToManyField(Tag, blank=True)

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您所做的只是访问ManyRelatedManager。您需要为该管理器指定查询。在python中,它将是:

publication.tags.all()

在django模板中,它将是:

{% for tag in publication.tags.all %}
   {{ tag }}
{% endfor %}

这应该包含在多对多关系的官方文件中。

编辑:以下是多对多关系工作原理的一个很好的示例:https://docs.djangoproject.com/en/1.5/topics/db/examples/many_to_many/

答案 1 :(得分:0)

因为您似乎遇到了一些问题,鉴于您对其他问题的评论,以下是对模板的更改。您根本不需要修改视图。

{% for publication in publication_list %}
  <li>{{ publication.title }}
  <ul>
  {% for tag in publication.tags.all %}
    <li>{{ tag.title }} </li>
  {% endfor %}
  </li>
  </ul>
{% endfor %}