gpt4 book ai didi

django - 如何在Django模板中显示包含多对多关系的对象列表?

转载 作者:行者123 更新时间:2023-12-02 07:08:13 25 4
gpt4 key购买 nike

我有以下型号:

class Tag(models.Model):
name = models.CharField(max_length=20)

class Entry(models.Model):
title = models.CharField(max_length=100)
date = models.DateField()
tags = models.ManyToManyField(Tag)

在 View 中,我创建一个 Entry 对象列表,并希望显示模板中的元素:

   {% for entry in entries %}
{{ entry.title }}
{{ entry.date }}
<!-- {% for tag in entry.tags %} {{ tag }} {% endfor %} -->
{% endfor %}

使用此模板代码,它会生成以下 TemplateSyntaxError 指向模板的第一行(用于标记):

渲染时捕获 TypeError:“ManyRelatedManager”对象不可迭代

entries 变量是一个列表:

entries = Entry.objects.filter(user=user_id)
entries = list(entries)
entries.sort(key=lambda x: x.id, reverse=False)

您知道这里可能存在什么问题以及如何解决此问题吗?

我是 Django 新手,因此任何有关如何调试模板的建议可能会有所帮助。

更新

即使使用此模板,我也会遇到相同的错误:

{% for entry in entries.all %}
<!-- everything is commented out here -->
{% endfor %}

最佳答案

无需将条目 QuerySet 转换为列表。此外,您可以让数据库使用 order_by 进行排序。 .

entries = Entry.objects.filter(user_id=user_id).order_by('id')

添加.all以获取关系中的所有值(就像Entry.objects.all())。

entry.tags.all

您也可以在 shell 中尝试此操作(我使用 ipython,因此您的输出可能看起来不同):

$ ./manage.py shell
# ...
In [1]: from yourproject.models import Entry, Tags
In [2]: entry = Entry.objects.all()[0]
In [3]: entry.tags
Out[3]: <django.db.models.fields.related.ManyRelatedManager object at 0x...>
In [4]: entry.tags.all() # for an entry with no tags.
Out[4]: []
In [5]: # add a few tags
In [6]: for n in ('bodywork', 'happy', 'muscles'):
...: t, created = Tag.objects.get_or_create(name=n)
...: entry.tags.add(t)
In [7]: entry.tags.all()
Out[7]: [<Tag: ...>, <Tag: ...>, <Tag: ...>]

如果您想调出具有零标签的条目,请使用 for..empty .

{% for tag in entry.tags.all %}
{{ tag.name }}
{% empty %}
No tags!
{% endfor %}

关于django - 如何在Django模板中显示包含多对多关系的对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3998527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com