繁体   English   中英

在 Django 中过滤查询集时如何更改日期?

[英]How to change dates when filtering a queryset in Django?

我想显示公司完成的所有付款的清单。 但我希望能够过滤日期,仅显示付款,例如:

  • 在过去 30 天内
  • 在过去 90 天内
  • 在两个特定日期之间

现在,我知道我可以在两个日期之间或今天之前过滤我的视图。 但是我如何使用模板上的下拉菜单或数据选择器来做到这一点?

像这样

像这样的东西供参考。

作为参考,付款 model 将是这样的:

class Payment(models.Model):
    name = models.CharField(max_length=250)
    date = models.DateField(default=datetime.now)
    value = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(0.00)])

使用带有选择字段的 django forms 并基于值过滤您的查询集。 例如:

选择:

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)

这个 function 将返回一个日期时间 object 来过滤您的查询集。

Forms:

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

所以基本上基于表单值我们得到一个日期时间 object 并过滤查询集(记住你有一个date对象)。 我使用模板视图而不是表单视图,因为我假设您不想接受发布请求。 但同样你可以使用表单视图并且不允许发布方法,这取决于你(也可以使用基于 function 的视图来完成)。 还要考虑表单可能为空的可能性,因此 http 请求中的查询字符串可能没有可能导致错误的period点参数,并按照您的喜好处理这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM