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 表单。如何从视图/模板填写表格?