在模板中对模型进行分组

时间:2011-05-29 15:29:23

标签: django django-models

我有两个相关的模型:

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 %}

如何在预置表旁边添加一个附加表(来自Extra model)?

像:

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

感谢。

2 个答案:

答案 0 :(得分: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'

您可以通过以下方式访问所有额外字段:

extras = list.extra_related_name.all()

假设您在每个Package模型中只有一个额外存在

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

答案 1 :(得分: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 %}