2011-05-29 67 views
1

我有兩個相關的模型:分組模型模板

class Package(models.Model): 
    package_name = models.CharField(max_length=64) 
    ptype = models.CharField(max_length=16) 

class Extra(models.Model): 
    package = models.ForeignKey(Package, related_name='package') 
    data = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True) 
    information = models.CharField(max_length=1024, blank=True) 

view.py:

def show_package(request): 
    list = get_list_or_404(Package, ptype='sometype') 
    return render(request, 'table.html', {'list': list}) 

和模板:

{% for row in list %} 
<table class="provider_list"> 
<tr> 
    <td>{{ row.package_name}}</td> 
    <td>{{ row.ptype }}</td> 
</tr> 
</table> 
{% endfor %} 

我如何添加一個額外的表(從額外的模型)旁邊的prelated表?

像:

<table> 
{% for extra_row in extra_list %} 
<tr> 
    <td>{{ extra_row.data }}</td> 
    <td>{{ extra_row.information }}</td> 
</tr> 
{% endfor %} 
</table> 

感謝。

+0

附近添加的第一個 – Hgeg 2011-05-29 15:51:26

回答

1

試試這個:

{% for package in list %} 
    <table class="provider_list"> 
     <tr> 
      <td>{{ package.package_name}}</td> 
      <td>{{ package.ptype }}</td> 
      <td> 
       <!-- fetch the related data --> 
       <table> 
       {% for extra in package.extra_set.all %} 
        <tr> 
         <td>{{ extra.data }}</td> 
         <td>{{ extra.information }}</td> 
        </tr> 
       {% endfor %} 
       </table> 
      </td> 
     </tr> 
    </table> 
{% endfor %} 
+0

這意味着,1000項,1000個新的查詢數據庫的一個結果另一個表。每個'package.exra_set.all'都是一個新的查詢。 – jazz 2011-05-29 19:24:17

1

您顯示在包ForeignKey上修改您的Extra related_name。

models.py

class Extra(models.Model): 
    extra = models.ForeignKey(Package,related_name='extra_related_name') #default for related_name would be 'extra_set' 

您可以通過訪問所有額外的字段:

額外= list.extra_related_name.all()

讓我們想象一下,你只有一個額外的現有每包模型

views.py

def show_package(request): 
    list = get_list_or_404(Package, ptype='sometype') 
    list.extra = list.extra_related_name.all()[0] 
    return render(request, 'table.html', {'list': list}) 

模板

{% for row in list %} 
<table class="provider_list"> 
<tr> 
    <td>{{ row.package_name}}</td> 
    <td>{{ row.ptype }}</td> 
    <td>{{ row.extra.data }}</td> 
    <td>{{ row.extra.information }}</td> 
</tr> 
</table> 
{% endfor %} 

如果您確信至多有一個元包你應該看看OneToOneField更容易獲得額外的費用。如果您不確定,請堅持使用ForeignKey並在視圖中添加檢查以檢查您是否正在訪問有效數據。