1

日付でフィルタリングしたいこれらのクラスベースの ListView があります。フィルターフォームを表示するためのシンプルなミックスインがあります。これはうまく機能します。

class MonthYearFormMixin(object):
    def get_context_data(self, **kwargs):
        context = super(MonthYearFormMixin, self).get_context_data(**kwargs)
        context['monthyearform'] = MonthYearForm(self.request.GET)
        return context

この mixin の機能を拡張して、クエリセット フィルタリングを含めたいと考えていますが、私のモデルには、フィルタリングする必要があるさまざまな日付フィールドがあり、1 つは start_date であり、もう 1 つはinvoice_date である可能性があります。もちろん、「すべての名前を「日付」に変更する」と言う人もいるかもしれませんが、それは私のモデルを代表するものではなく、さらに、start_date と end_date を持つモデルがあるかもしれませんが、start_date でのみフィルタリングしたい場合があります。ここに私の見解があります:

class SentList(MonthYearFormMixin, ListView):
    model = Sent
    context_object_name = 'object'
    template_name = 'sent_list.html'

    def get_queryset(self):
        qs = self.model.objects.all()
        if 'month' in self.request.GET:
            if int(self.request.GET['month']) > 0:
                qs = qs.filter(start_date__month=self.request.GET['month'])
        if 'year' in self.request.GET:
            if int(self.request.GET['year']) > 0:
                qs = qs.filter(start_date__year=self.request.GET['year'])
        return qs

class ReceivedList(MonthYearFormMixin, ListView):
    model = Received
    context_object_name = 'object'
    template_name = 'received_list.html'

    def get_queryset(self):
        qs = self.model.objects.all()
        if 'month' in self.request.GET:
            if int(self.request.GET['month']) > 0:
                qs = qs.filter(invoice_date__month=self.request.GET['month'])
        if 'year' in self.request.GET:
            if int(self.request.GET['year']) > 0:
                qs = qs.filter(invoice_date__year=self.request.GET['year'])
        return qs

違うのは日付フィールドの名前だけなので、このコードを繰り返さなければならないのはイライラします。

4

1 に答える 1