首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模板中按月显示查询集结果

在模板中按月显示查询集结果
EN

Stack Overflow用户
提问于 2017-03-12 18:04:18
回答 1查看 667关注 0票数 0

我希望将我的查询集的结果按月分组,并将月份名称作为每个表的标题。

我有一个这样的模型:

代码语言:javascript
复制
class Tenant(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    telephone = models.CharField(max_length=30)
    email = models.CharField(max_length=30)
    contract_end = models.DateField(blank=False)

    def __str__(self):
        return u'%s %s' % (self.first_name, self.last_name)

如下图所示:

代码语言:javascript
复制
def expired_contracts(request):
    now = datetime.datetime.now()
    tenant_queryset = Tenant.objects.all()
    expired_list = []

    for x in range(0, 12):
        date = now + relativedelta(months=x)
        expired = tenant_queryset.filter(
            contract_end__year=date.year,
            contract_end__month=date.month
            )
        expired_list += expired

context = {"expired_list": expired_list}

return render(request, "expired_template.html", context)

模板:

代码语言:javascript
复制
{% for tenant in expired_list %}
<table>
<tr>
<td>{{ tenant.first_name }}</td>
<td>{{ tenant.telephone }}</td>
<td>{{ tenant.contract_end }}</td>
</tr>
</table>
{% endfor %}

我想我可以创建一堆空列表,并用循环和if语句填充它们,但这似乎有点多。

有没有别的办法可以让我这么做呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-12 21:51:10

itertools.groupby()是一个对列表进行分组的优秀工具。

首先,您应该根据要分组的属性对对象进行排序

代码语言:javascript
复制
tenant_queryset = Tenant.objects.order_by('contract_end')

按月分组可以通过使用itertools.groupby并将日期格式化为字符串date.strftime('%B')来实现

代码语言:javascript
复制
context = {
    "expired_list": itertools.groupby(
        expired_list, 
        lambda t: t.contract_end.strftime('%B')
    )
}

然后,您可以遍历模板中的月份和该月的租户,如下所示

代码语言:javascript
复制
{% for month, tenants in expired_list %}
<h3>{{ month }}</h3>
<table>
    {% for tenant in tenants %}
    <tr>
        <td>{{ tenant.first_name }}</td>
        <td>{{ tenant.telephone }}</td>
        <td>{{ tenant.contract_end }}</td>
    </tr>
    {% endfor %}
</table>
{% endfor %}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42746067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档