2016-05-31 55 views
1

我正在为自己编写一个待办事项列表应用程序,以及一种更好地熟悉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> 

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但是当我这样做时,我没有得到任何输出。我确实有项目填充数据库,当我从视图打印到控制台时,我看到了我期望的值。任何建议和/或指导将是惊人的。

回答

0

您的getLists函数返回一个字典,将列表映射到列表。因此,当您在模板中对lists进行迭代时,您正在遍历该字典:遍历列表只是给出了键,这里是列表名称。

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

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

我不知道为什么在迭代它时我没有停下来思考字典。谢谢您的帮助! – moovlin