【问题标题】:How do I display Django ManyToMany on a template? Simple code needed如何在模板上显示 Django ManyToMany?需要简单的代码
【发布时间】: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
  • 没有双重引用。 :)

标签: django


【解决方案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,否则渲染模板会导致大量额外查询。

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2014-08-12
    • 1970-01-01
    • 2012-05-09
    • 2016-11-06
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    相关资源
    最近更新 更多