2017-03-12 6 views
0

IDクエリの結果を月単位でグループ化し、各テーブルのヘッダーとして月名を付けたいとします。クエリーセットの結果をテンプレートで月別に表示する

私はそうのようなモデルがあります:私は、私は空のリストの束を作成し、移入ことができると思います

{% for tenant in expired_list %} 
<table> 
<tr> 
<td>{{ tenant.first_name }}</td> 
<td>{{ tenant.telephone }}</td> 
<td>{{ tenant.contract_end }}</td> 
</tr> 
</table> 
{% endfor %} 

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) 

テンプレート:そうのような

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) 

ビューそれらはループとif文を使っていますが、それは少ししか見えません。

他の方法でこれを行うことができますか?

ありがとうございます!

答えて

0

itertools.groupby()は、あなたのリストをグループ化するための優れたツールです。

まず、あなたは、文字列date.strftime('%B')

context = { 
    "expired_list": itertools.groupby(
     expired_list, 
     lambda t: t.contract_end.strftime('%B') 
    ) 
} 
と月の名前と日付を itertools.groupbyを使用してフォーマットすることによって達成することができ、月によって

tenant_queryset = Tenant.objects.order_by('contract_end') 

グループ化によってグループ化されている属性によって、あなたのオブジェクトを注文する必要があります

テンプレートのその月の月とテナントをループすることができます。

{% 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 %} 
+0

Iainヘルプありがとうございます。私はあなたの方法を試して、それは動作します。私は、regroupタグを使って別の方法も見つけました。将来の使用のためにitertoolsと一緒に遊びに行く – OrangeBubbles

+0

@OrangeBubbles - 今後12ヶ月以内にすべてのテナントが契約期限切れとなるようにクエリを1つだけ調べる必要があります。このリストをgroupbyまたはregroupに渡して同じ結果を得ることができますが、クエリの1/12 –

関連する問題