2011-05-29 65 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并在视图中添加检查以检查您是否正在访问有效数据。