2015-05-21 51 views
0

我想只打印與我的模型的外鍵關聯的條目。我有一系列的列表,我想打印列表名稱和屬於該列表的所有項目。我當前的問題是,每個列表都有一個div生成,這很好,但是與每個列表關聯的每個項目都在div內打印出來,而不僅僅是與listname關聯的項目。打印字段只與django中的foreignkey有關

查看

def control_panel(request, username): 

    context = RequestContext(request) 
    if username == request.user.username: 
     if request.user.is_authenticated(): 
      user = User.objects.get(username=username) 

      lists = request.user.newlist_set.all() 

      listitems = request.user.newlistitem_set.all().filter(list_name = lists) 

      return render_to_response('controlpanel.html', {'lists': lists,'listitems':listitems,}, context) 
     else: 
      return render_to_response('login.html', {}, context) 
    else: 
     return render_to_response('controlpanel.html', {}, context) 

模型

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

class newlist(models.Model): 
    user = models.ForeignKey(User) 
    list_name = models.CharField(max_length = 100) 
    picture = models.ImageField(upload_to='profiles/', default = "") 

    def __str__(self): 
     return self.list_name 

class newlistitem(models.Model): 
    user = models.ForeignKey(User) 
    list_name = models.ForeignKey(newlist) 
    list_item = models.CharField(max_length = 200) 


    def __str__(self): 
     return self.list_item 

HTML

  {% for lista in lists %} <!-- This is a call to the lists that exist for eaach model taht s instantiates --> 

        <div id = "indivlistitem"> 


         <b>{{lista}}</b><br> <!-- This is the title of each list that is rendered to the HTML --> 

         {% for eachlistitem in listitems %} 

          {{eachlistitem}} 

         {%endfor%} 

        </div> 

       {% endfor %} 

回答

1

據我所知,你不需要在你的情況下你的listItems中,具有newlists應該足夠了。您也可以訪問模板中的查詢,因此您可以直接在模板中訪問外鍵。像這樣:

{% for eachlistitem in lista.newlistitem_set.all %} 

。 這會給你列出所有有lista列表當前lista列表名稱

+0

我相信這就是我要做的,但是你的代碼片段無法打印任何東西。 – ryan

+0

哼,我沒有把正確的模型名稱。它應該是lista.newlistitem_set.all。 –

+0

非常感謝! – ryan

1

問題在於你的models.py中的listitems定義。具體而言,您將lists定義爲與給定用戶有關的所有列表,這很好,但是將與該用戶有關的每個列表(filter(list_name=lists)相關的每個列表項定義爲listitems,這是不好的。

由於請求上下文只是Python字典,並且可以被嵌套,我會做類似如下:

def control_panel(request, username): 

    context = RequestContext(request) 
    if username == request.user.username: 
     if request.user.is_authenticated(): 
      user = User.objects.get(username=username) 

      lists = request.user.newlist_set.all() 

      listitems = {} 
      for list in lists: 
       listitems[list.list_name] = request.user.newlistitem_set.filter(list_name=list) 

      return render_to_response('controlpanel.html', {'lists': lists,'listitems':listitems,}, context) 
     else: 
      return render_to_response('login.html', {}, context) 
    else: 
     return render_to_response('controlpanel.html', {}, context) 

這將創建一個字典,每個列表中的一個條目,然後你可以在渲染模板:

 {% for lista in lists %} <!-- This is a call to the lists that exist for eaach model taht s instantiates --> 

       <div id = "indivlistitem"> 


        <b>{{lista}}</b><br> <!-- This is the title of each list that is rendered to the HTML --> 

        {% for eachlistitem in listitems.{{lista.list_name}} %} 

         {{eachlistitem}} 

        {%endfor%} 

       </div> 

      {% endfor %} 
+0

嗯,我收到以下內容:異常類型:\t類型錯誤 異常值:\t all()獲得了意外的關鍵字參數'list_name' – ryan

+0

對不起,all()應該是過濾器。上面更新了答案。 – JSchwerberg

+0

感謝您的解釋,遺憾的是JulienGrégoire很好地解決了這個問題。 – ryan

相關問題