2013-04-12 84 views
1

我有这些基于类的ListView,我想按日期过滤。我有一个简单的mixin 显示filterform,伟大的工程:Django 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 

我想延长这种混入的功能包括查询集过滤,但我的模型 有不同的日期字段需要被过滤,其中一个可能是start_date,另一个可能是 invoice_date。当然,有人可能会说,“将它们全部重命名为'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 

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

回答

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' 
+0

QS = qs.filter(start_date__month = self.request.GET [DATE_FIELD_NAME]) - >起始日期是字段名在过滤中需要动态。如果字段名称是invoice_date,该怎么办? – scoopseven

+0

刚刚刷新,看到你的编辑,将与我刚才的另一个想法一起测试... – scoopseven

+0

正确的“你的形式看起来像这样:”阅读“你的意见看起来像这样:”,它的作品完美。我从来没有想过要通过kwargs来过滤。优秀! – scoopseven