Django模板 - 使用2个模型来过滤结果

时间:2018-03-20 06:28:37

标签: python django django-templates django-views

如果我的问题不清楚,请道歉。我是Django的新手,这是我第一次在这里提问,因为我无法找到解决问题的方法。

我已经研究过如何在Django模板中使用多个模型并成功完成了这项工作,但是,我的要求之一就是列表中的每个卡车司机都应该显示相应数量的注册卡车单位,但我可以&# 39;似乎这样做。

输出应该是这样的:

Truckers List
Registered Trucker  Number of units
Trucker #1          10
Trucker #2          5
...
Trucker #n          3

如果您有任何建议我非常感谢。我在Windows上使用Django版本2.0.1和Python 3.6,如果这是相关的。

这是我的代码:

models.py

class Trucker(models.Model):
    name = models.CharField(max_length=50)
    def __str__(self):
        return self.name

class TruckUnit(models.Model):
    plate_number = models.CharField(max_length=7)
    trucker = models.ForeignKey(Trucker, related_name='truckunits', on_delete=models.CASCADE)

    def __str__(self):
        return self.plate_number

views.py

class TruckerList(generic.ListView):
    model = Trucker
    context_object_name = 'trucker_list'
    queryset = Trucker.objects.all().order_by('name')
    template_name = 'trip_monitor/trucker_list.html'

    def get_context_data(self. **kwargs):
        context = super(TruckerList, self).get_context_data(**kwargs)
        context['units'] = TruckUnit.objects.all()
        context['truckers'] = self.queryset
        return context

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('truckers/', views.TruckerList.as_view(), name='trucker_list'),
]

trucker_list.html

{% extends 'base.html' %}
{% block content %}
<h3>Trucker List</h3>
    {% if trucker_list %}
    <table>
        <thead>
            <tr>
                <th>Registered Truckers</th>
                <th>Number of units</th>
            </tr>
        </thead>
        <tbody>
            {% for trucker in trucker_list %}
            <tr>
                <td>{{ trucker.name }}</td>
                <td>{{ units.count }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    {% else %}
    <p>No registered truckers yet</p>
    {% endif %}
{% endblock %}

2 个答案:

答案 0 :(得分:2)

你可以做到

from django.db.models import Count

然后

queryset = Trucker.objects.all().annotate(Count("truckunits")).order_by('name')

然后在模板中

{% for trucker in trucker_list %}
<tr>
    <td>{{ trucker.name }}</td>
    <td>{{ trucker.truckunits__count }}</td>
</tr>
{% endfor %}

答案 1 :(得分:0)

将查询放在get_context_data中,创建一个新的上下文值,如:

  
    

context ['products'] = Products.objects.all()

  

您将在模板中获得查询集。

我希望它可以帮到你