Django Mixin中的动态字段名称

时间:2013-04-12 15:14:22

标签: django mixins django-class-based-views

我有这些基于类的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的功能,包括查询集过滤,但我的模型 有不同的日期字段需要过滤,一个可能是start_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

唯一不同的是日期字段的名称,所以不得不重复这一点令人沮丧 这段代码。

1 个答案:

答案 0 :(得分:0)

为什么不创建一个名为date_field_name的成员变量,在其中存储应由QuerySet处理器mixin处理的字段名称?

此列表将在使用mixin的类中定义。

这样的东西
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

    def get_queryset(self):
        qs = self.model.objects.all()
        if 'month' in self.request.GET:
            if int(self.request.GET['month']) > 0:
                kwargs = {('%s__month' % self.date_field_name): self.request.GET['month']}
                qs = qs.filter(**kwargs)
        if 'year' in self.request.GET:
            if int(self.request.GET['year']) > 0:
                kwargs = {('%s__year' % self.date_field_name): self.request.GET['year']}
                qs = qs.filter(**kwargs)
    return qs

您的观点将如下所示:

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