如何在模板上显示 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_names 的工作很糟糕。 你不需要在关系的两边都定义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 %

请注意,如果要渲染ManyToManyFields 的所有值,最好在查询集中使用.prefetch_related(..) 来预取Person,否则渲染模板会导致大量额外查询。

【讨论】:

以上是关于如何在模板上显示 Django ManyToMany?需要简单的代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板上显示 Django ManyToMany?需要简单的代码

Django:如何根据表单中的选定选项在模板上显示来自 django 数据库的图像?

如何在 Django 模板中显示分页?

如何通过将字符串格式化为 django 模板来显示数据?

如何计算 Django 模板中的产品?

如何在 Django 模板引擎上截断/切片字符串?