Python 在一个模板中显示所有多对多关系

Python 在一个模板中显示所有多对多关系,python,html,django,django-templates,many-to-many,Python,Html,Django,Django Templates,Many To Many,我正在为自己编写一个待办事项列表应用程序,同时也是一种更好地熟悉Django及其所有令人痛苦的复杂情况的方法 我试图在列表模型和项目模型之间使用多对多关系,这样一个项目一次可以出现在一个或多个列表中 以下是相关代码: models.py from django.db import models from django.contrib.auth.models import User from datetime import datetime def makeName(): return

我正在为自己编写一个待办事项列表应用程序,同时也是一种更好地熟悉Django及其所有令人痛苦的复杂情况的方法

我试图在列表模型和项目模型之间使用多对多关系,这样一个项目一次可以出现在一个或多个列表中

以下是相关代码:

models.py

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime

def makeName():
    return datetime.now()

# Create your models here.
class List(models.Model):
    #owner = models.ForeignKey(User, on_delete=models.CASCADE)
    list_create = models.DateTimeField(auto_now_add=True)
    canView = models.ManyToManyField(User, blank=True, related_name='user')
    listName = models.CharField(default=makeName, max_length=100)


class Item(models.Model):
    list = models.ManyToManyField(List, blank=True)
    field = models.TextField(max_length=100)
    name = models.CharField(max_length=100)
    date = models.DateTimeField('Date Made', auto_now_add=True)
    completed = models.DateTimeField()
    status = models.BooleanField(default=False)
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home</title>
</head>
<body>
{%  if lists %}
    <table>
    {% for list in lists %}
        <!--{{ list }}
        {{ list.item_set.all }}-->
        {% for item in list.item_set.all %}
            <tr>
                <td>{{ item.field }}</td>
            </tr>
            <br>
        {% endfor %}
    {% endfor %}
    </table>
{%  else %}
    Woops, you don't have any lists. Consider adding one.
{% endif %}
</body>
</html>

所以我的问题似乎在于index.html。我试图在一页上显示每个列表中的每个项目。半相似程度的问题基本上说,迭代list.item_set.all,但当我这样做时,我并没有得到任何输出。我确实有填充数据库的项目,当我从视图打印到控制台时,我确实看到了我期望的值。任何建议和/或指导都将是惊人的

您的
getLists
函数返回一个dict,将列表名称映射到列表。因此,当您在模板中迭代
列表时,您就是在迭代该命令:迭代列表只会给出键,这里是列表名

如果您想测试多对多项目的迭代,您应该简化代码;完全删除getLists函数,只返回列表

def index(request):
    lists = List.objects.filter(canView__user__id=request.user.id)
    return render(request, 'index.html', {'lists': lists})

函数返回一个dict,将列表名映射到列表。因此,当您在模板中迭代
列表时,您就是在迭代该命令:迭代列表只会给出键,这里是列表名

如果您想测试多对多项目的迭代,您应该简化代码;完全删除getLists函数,只返回列表

def index(request):
    lists = List.objects.filter(canView__user__id=request.user.id)
    return render(request, 'index.html', {'lists': lists})

我不知道为什么我在迭代字典时不停地思考它。谢谢你的帮助!我不知道为什么我在迭代字典时不停地思考它。谢谢你的帮助!