2016-05-31 6 views
1

私は自分自身のためにToDoリストアプリケーションを作成するだけでなく、Djangoとそのすべてが痛いほどの複雑さに慣れる方法を書いています。1つのテンプレートに多対多の関係をすべて表示する

リストモデルとアイテムモデルの間に多対多の関係を使用して、アイテムが一度に1つ以上のリストに存在するようにしようとしています。ここで

は、関連するコードです:

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にあります。私はすべてのリストのすべてのアイテムをすべて1ページに表示しようとしています。 This半類似の程度の質問は、基本的に言って、list.item_set.allを繰り返しますが、私がそれをするとき、私は出力を得ません。私はアイテムをデータベースに設定していますが、ビューからコンソールに印刷するときは、私が期待する値が表示されます。アドバイスや指導はすばらしいことでしょう。

答えて

0

getLists関数はdictを返し、リスト名をリストにマッピングします。だから、テンプレート内でlistsを繰り返し処理すると、そのdictを反復処理しています。リストを反復すると、ここではリスト名であるキーが返されます。

多対多の項目に対して反復処理をテストする場合は、コードを単純化する必要があります。そのgetLists関数を完全に削除し、リストを返すだけです。

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

なぜ、私はそれがそれを反復することになったときに辞書について考えるのをやめなかったのか分かりません。助けてくれてありがとう! – moovlin

関連する問題