Django 多对多模板问题

Posted

技术标签:

【中文标题】Django 多对多模板问题【英文标题】:Django ManyToMany Template Questions 【发布时间】:2010-11-17 01:12:04 【问题描述】:

大家早上好,

我从事 php 程序员已经有一段时间了,但我觉得需要更多地朝着 Python 方向发展,还有什么比玩 Django 更好。

在此过程中,我遇到了一个停止点,我知道有一个简单的解决方案,但我只是想念它 - 如何在 Django 模板中显示多对多关系?

我的 Django 模型:(大部分字段已被删除)

class Category(models.Model):
    name = models.CharField(max_length=125)
    slug = models.SlugField()   
categories = models.ManyToManyField(Category, blank=True, null=True)

class Recipe(models.Model):
    title = models.CharField('Title', max_length=250)
    slug = models.SlugField()

class Photo(models.Model):
    recipe = models.ForeignKey(Recipe)
    image = models.ImageField(upload_to="images/recipes", blank=True)

所以,我在应用程序中使用了一些基本模型,称为“食谱”。 话虽如此,我正在寻找两个问题的答案:

    如何在其详细信息页面上显示食谱的类别? 如何在其详细信息页面上显示食谱的图像?

如果我进入 Python shell,并输入以下内容,我会得到一个结果:

>>> photos = Photo.objects.filter(recipe=1)
>>> photos
[<Photo: Awesome Pasta>]
>>> for photo in photos:
...     print "Photo: %s" % photo.logo
... 
Photo: images/recipes/2550298482_46729d51af__.jpg

但是,当我在模板中尝试以下类似操作时,我收到一条错误消息“无效的块标签:'photo.image'。”

% for photo in photos %
% photo.image %
% endfor %

尽管这确实有效,但 ID 仍被硬编码到视图中,您将如何为每个配方设置此动态?

详情页面View.py sn -p:

def details(request, slug='0'):
    p = get_object_or_404(Recipe, slug=slug)
    photos = Photo.objects.filter(recipe=1)
    return render_to_response('recipes/recipes_detail.html', 'p': p, 'photos': photos)

提前感谢您的帮助和理解,这对你们所有人来说可能是一个非常简单的问题!

更新:删除模型中的附加字段时,我忘记了 Recipes 模型的类别字段。

【问题讨论】:

尽管问题在其标题中提到了 ManyToMany,但我实际上并没有看到任何已定义的 ManyToMany 字段。 “recipe = models.ForeignKey(Recipe)”在技术上不是多对多关系吗?如果不是,我为所使用的语言道歉,并很乐意更改它。 @R。 Bemrose - 抱歉,categories 字段是一个 ManyToMany 字段,在删除问题不需要的额外字段时,它只是被遗漏了。 【参考方案1】:

据我所知,我认为您遇到了一个小语法错误:

% photo.image %

应该是:

 photo.image 

% % 表示法用于 django 模板标签。另一方面,变量用 表示法表示。

要使其动态化,您可以利用Photo 模型具有Recipe 的外键这一事实。这意味着您使用 slug 加载的 Recipe 实例与照片集之间存在反向关系:

def details(request, slug='0'):
    p = get_object_or_404(Recipe, slug=slug)
    photos = p.photo_set.all()

希望这对你有用。很高兴看到您喜欢使用 Django!

【讨论】:

非常感谢所有的帮助,非常感谢,我的页面现在有图片了!

以上是关于Django 多对多模板问题的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO:在模板中显示多对多的附加字段

Django模板过滤2个多对多字段

模板中的多对多通过模型中的 Django 访问条目

多对多模型的 Django 表单。如何从视图/模板填写表格?

如何在引导选项卡块中按 django 模板中的多对多字段过滤对象

Django 多对多字段过滤器列表