使用带有选择字段的 django 表单并根据您的查询集的值过滤器。例如:
选择:
PERIOD_LAST_THREE_MONTHS = "last-three-months"
PERIOD_LAST_SIX_MONTHS = "last-six-months" # ..
PERIOD_CHOICES = (
(PERIOD_LAST_THREE_MONTHS, _("Last 3 Months")),
(PERIOD_LAST_SIX_MONTHS, _("Last 6 Months")), ..
)
注意:变量用连字符分隔,因为它们将用于http请求的查询字符串。
实用程序:
def get_period_date(period):
if period == PERIOD_LAST_THREE_MONTHS:
return timezone.now() - timezone.timedelta(days=90)
elif period == PERIOD_LAST_SIX_MONTHS:
return timezone.now() - timezone.timedelta(days=180)
此函数将返回一个日期时间对象来过滤您的查询集。
表格:
class DateForm(forms.Form):
period = forms.ChoiceField(choices=PERIOD_CHOICES, required=False)
查看:
class PaymentFormView(base.TempleView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['payments'] = Payment.objects.filter(date__gte=get_period_date(self.request.GET('period'))
return context
所以基本上基于表单值我们得到一个日期时间对象并过滤查询集(记住你有一个date 对象)。我使用模板视图而不是表单视图,因为我假设您不想接受发布请求。但是同样你可以使用表单视图并且不允许发布方法,这取决于你(也可以使用基于函数的视图来完成)。还要考虑表单可能为空的可能性,因此 http 请求中的查询字符串可能没有可能导致错误的 period 参数,并按照您的喜好处理这种情况。