在Django中访问多对多关系

时间:2011-05-13 21:35:52

标签: django many-to-many

我已经设置了几个模型如下:

图像

图库和图像共享多对多的关系。

页面可以有1个或0个画廊。

我创建了一个包含一些图像的图库,并将其附加到页面对象。

但是,我在模板中显示它时遇到了麻烦。

有人可以帮忙吗?

我的页面视图如下所示:

def detail(request, page_id):
p = get_object_or_404(Page, pk=page_id)
return render_to_response('page/detail.html', {'page': p},
                      context_instance=RequestContext(request))

模板:

{% block images %}
{% if page.gallery %}
{% for image in page.gallery.image_set.all %}
<a rel="gallery" href="{{ STATIC_URL }}{{ image.image }}"></a>
{% endfor %}
{% endif %}
{% endblock %}`

如果我尝试在IF块中输出一些文本,它就会出现,但不在循环中。

任何关于让它发挥作用/一般整理它的建议都将非常感激。

感谢。

2 个答案:

答案 0 :(得分:5)

如果Gallery-Image关系是多对多,我猜你的m2m模型上有一个Gallery字段,其中m2m管理器就是字段本身。可以像查看任何其他QuerySetmodel_instance.mym2mfield.filter()一样查询经理。

如果ManyToManyField模型上的images被称为Gallery,您的模板将如下所示:

{% for image in page.gallery.images.all %}
    <a rel="gallery" href="{{ STATIC_URL }}{{ image.image }}"></a>
{% endfor %}

如果您的ManyToManyField模型上有Image,则默认名称将如您所述,除非您指定related_name,否则您将使用该名称。

{% for image in page.gallery.image_set.all %}

答案 1 :(得分:1)

您的问题可能在于您从网页访问图库的方式。在您的模板中,尝试以下内容,看看是否有任何输出:

{{ page.gallery }}

有些情况下,模板中可能会忽略某些错误。

另外,我有点好奇你的页面和图库是如何相关的? Page模型是否有一个名为“gallery”的OneToOneField? Gallery是否有一个ForeignKey to Page?在后一种情况下,您可以通过以下方式访问与页面关联的图库:

{{ page.gallery_set.all }}

如果您提供了有关模型字段的其他信息,那么回答这个问题会更容易。