如何在Django中进行日期范围过滤?

时间:2020-09-03 21:46:10

标签: python html django

我想让用户通过选择日期范围来搜索数据。

我的模型

class Expense(models.Model):
    class Meta:
        ordering = ('date', '-pk')

    category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    date = models.DateField(default=datetime.date.today, db_index=True)

    def __str__(self):
        return f'{self.date} {self.name} {self.amount}'

VIEWS.PY

class ExpenseListView(ListView):
    model = Expense  # imported db model
    paginate_by = 5

    def get_context_data(self, *, object_list=None, **kwargs):

        queryset = object_list if object_list is not None else self.object_list

        form = ExpenseSearchForm(self.request.GET)
        if form.is_valid():

            name = form.cleaned_data.get('name', '').strip()
            if name:
                queryset = queryset.filter(name__icontains=name)

            category = form.cleaned_data['category']
            if category:
                queryset = queryset.filter(category=category)

            grouping = form.cleaned_data['grouping']
            if grouping:
                queryset = queryset.order_by('date', '-pk')

        return super().get_context_data(
            form=form,
            object_list=queryset,
            summary_per_category=summary_per_category(queryset),
            summary_per_year_month=summary_per_year_month(queryset),
            total_amount_spent=total_amount_spent(),
            **kwargs)

我希望我可以像that那样进行外观和工作(来自我的应用程序的示例,两行HTML只是为了向您展示我想要的结果)。我不知道如何使它与其他所有东西一起工作,特别是我想将其包括到已经具有django形式的ListView中。有什么想法吗?也许您可以以某种方式指导我?经过一整天的研究,我完全感到困惑,没有任何好结果。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

Expense.objects.all(date__range[START_DATE, END_DATE])

更新

  1. 要从“日期”字段返回范围,可以使用上面的示例。

  2. get_context_data用于传递其他信息。如果您希望处理表单中的数据,请使用:post(self,request,* args,** kwargs)。但是,在这种情况下,您仅需要以下内容:

     def get_context_data(self, *, **kwargs):
         context = super().get_context_data(**kwargs)
         context['form'] = YOUR_FORM_HERE
         return context
    

我不确定您如何处理表单和视图本身,但是(最初)您可以设置一个名为context_object_name的变量(例如context_object_name =“ results”;该变量在视图中将显示为{{{results}})。

Post()需要HTTP响应,因此您可以使用render方法:

args = {
   "results": Expense.objects.all(date__range[START_DATE, END_DATE])
}

return render(request, TEMPLATE_NAME, args)

希望这会有所帮助!