在一个模板中显示所有多对多关系
Displaying all Many to Many relationships in one template
我正在为自己编写一个待办事项列表应用程序,同时也是一种让自己更好地熟悉 Django 及其所有令人痛苦的错综复杂的方法。
我正在尝试在 List 模型和 Item 模型之间使用多对多关系,这样一个项目可以同时出现在一个或多个列表中。
相关代码如下:
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>
views.py
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from .models import List, Item
from .forms import ItemForm
from django.shortcuts import render, get_object_or_404
# Create your views here.
def getLists(request):
lists = List.objects.filter(canView__user__id=request.user.id).values('listName')
temp2 = dict()
for list in lists:
temp = list.get('listName')
temp2[temp] = List.objects.get(listName=temp)
return temp2
@login_required
def index(request):
lists = dict()
lists = getLists(request)
list = lists['MainList']
print(list.item_set.get(pk=1))
print(lists['MainList'].item_set.count())
return render(request, 'index.html', {'lists': lists})
所以我的问题似乎出在index.html。我试图在一页上显示每个列表中的每个项目。 This 半相似度的问题基本上是说,迭代 list.item_set.all 但是当我这样做时,我没有得到任何输出。我确实有项目填充数据库,当我从视图打印到控制台时,我确实看到了我期望的值。任何建议 and/or 指导都会很棒。
您的 getLists
函数 return 是一个字典,将列表名称映射到列表。因此,当您在模板中遍历 lists
时,您就是在遍历该字典:而遍历列表只会给出键,这里是列表名称。
如果你想测试多对多项目的迭代,你应该简化你的代码;完全删除 getLists 函数,只删除 return 列表。
def index(request):
lists = List.objects.filter(canView__user__id=request.user.id)
return render(request, 'index.html', {'lists': lists})
我正在为自己编写一个待办事项列表应用程序,同时也是一种让自己更好地熟悉 Django 及其所有令人痛苦的错综复杂的方法。
我正在尝试在 List 模型和 Item 模型之间使用多对多关系,这样一个项目可以同时出现在一个或多个列表中。
相关代码如下:
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>
views.py
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from .models import List, Item
from .forms import ItemForm
from django.shortcuts import render, get_object_or_404
# Create your views here.
def getLists(request):
lists = List.objects.filter(canView__user__id=request.user.id).values('listName')
temp2 = dict()
for list in lists:
temp = list.get('listName')
temp2[temp] = List.objects.get(listName=temp)
return temp2
@login_required
def index(request):
lists = dict()
lists = getLists(request)
list = lists['MainList']
print(list.item_set.get(pk=1))
print(lists['MainList'].item_set.count())
return render(request, 'index.html', {'lists': lists})
所以我的问题似乎出在index.html。我试图在一页上显示每个列表中的每个项目。 This 半相似度的问题基本上是说,迭代 list.item_set.all 但是当我这样做时,我没有得到任何输出。我确实有项目填充数据库,当我从视图打印到控制台时,我确实看到了我期望的值。任何建议 and/or 指导都会很棒。
您的 getLists
函数 return 是一个字典,将列表名称映射到列表。因此,当您在模板中遍历 lists
时,您就是在遍历该字典:而遍历列表只会给出键,这里是列表名称。
如果你想测试多对多项目的迭代,你应该简化你的代码;完全删除 getLists 函数,只删除 return 列表。
def index(request):
lists = List.objects.filter(canView__user__id=request.user.id)
return render(request, 'index.html', {'lists': lists})