如何在模板上显示 Django ManyToMany?需要简单的代码
Posted
技术标签:
【中文标题】如何在模板上显示 Django ManyToMany?需要简单的代码【英文标题】:How do I display Django ManyToMany on a template? Simple code needed 【发布时间】:2019-10-16 08:56:08 【问题描述】:我正在尝试以相反的顺序在模板上显示 ManyToMany 字段。
这就是我的意思:
当 ManyToMany 字段是模型中使用的字段时,我设法在模板上显示 ManyToMany 字段,例如:
<br/>% for tag in post.tag.all % tag <br/>% endfor %
将基于此模型显示帖子所属的所有标签(即类别):
class Post(models.Model):
tag = models.ManyToManyField(Tag,blank=True,null=True,related_name='tag')
现在我想要一些相反的东西 - 当 ManyToMany 字段位于 Author 模型中时显示帖子的作者(上面的帖子模型保持不变):
class Person(models.Model):
post=models.ManyToManyField(Post,blank=True,null=True,related_name='post')
我很确定它与相关对象引用有关 (https://docs.djangoproject.com/en/2.2/ref/models/relations/)
就是做不出来。
我已经在模板上尝试了以下内容。
% for post in posts %
% for author in post.person_set.all %author<br/>% endfor %
% endfor %
另外,我应该像上面那样在模板上进行这种搜索,还是将这种搜索放在视图中更好的做法...资源方面。
感谢您的帮助。
【问题讨论】:
由于您已将related_name
设置为'post'
(这不是 一个好主意),您应该写% for author in post.post.all %
,但真正的错误是您这样做了related_name
s 的工作很糟糕。
你不需要在关系的两边都定义ManyToManyField。选择一个。
@DanielRoseman:我不相信他会这样做,Post
中的 m2m 指的是Tag
,而不是Person
。
没有双重引用。 :)
【参考方案1】:
您对related_name=
parameter [Django-doc] 的作用存在误解。就像文档说的:
用于关系的名称从相关对象回到这个对象。 (...)
所以它是 reverse 中关系的名称。为了使您的模型“听起来”,您应该将其命名为:
class Person(models.Model):
posts = models.ManyToManyField(Post, blank=True, null=True, related_name='authors')
这里使用复数也很有意义,所以posts
而不是post
。
在这种情况下,您可以使用以下方式渲染它:
% for post in posts %
% for author in post.authors.all %author<br/>% endfor %
% endfor %
请注意,如果要渲染ManyToManyField
s 的所有值,最好在查询集中使用.prefetch_related(..)
来预取Person
,否则渲染模板会导致大量额外查询。
【讨论】:
以上是关于如何在模板上显示 Django ManyToMany?需要简单的代码的主要内容,如果未能解决你的问题,请参考以下文章
如何在模板上显示 Django ManyToMany?需要简单的代码