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
这是唯一不同的是日期字段的名称,所以这是令人沮丧不得不重复 此代码。
QS = qs.filter(start_date__month = self.request.GET [DATE_FIELD_NAME]) - >起始日期是字段名在过滤中需要动态。如果字段名称是invoice_date,该怎么办? – scoopseven
刚刚刷新,看到你的编辑,将与我刚才的另一个想法一起测试... – scoopseven
正确的“你的形式看起来像这样:”阅读“你的意见看起来像这样:”,它的作品完美。我从来没有想过要通过kwargs来过滤。优秀! – scoopseven