我想让用户通过选择日期范围来搜索数据。
我的模型
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中。有什么想法吗?也许您可以以某种方式指导我?经过一整天的研究,我完全感到困惑,没有任何好结果。
答案 0 :(得分:0)
您可以使用以下内容:
Expense.objects.all(date__range[START_DATE, END_DATE])
更新:
要从“日期”字段返回范围,可以使用上面的示例。
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)
希望这会有所帮助!