如何将Django表单的日期输入值传递给QuerySet筛选?
解决表单日期筛选QuerySet的问题
问题根源
你遇到的'DateInput' object has no attribute 'date'错误,核心原因有两个:
- 表单类定义错误:
DateInput是Django表单的部件(widget),并非完整的表单类,不能直接用来接收请求数据。 - 取值方式错误:即便表单类正确,也不能直接通过
form.date获取输入值,必须先通过表单验证,再从清洗后的数据中提取。
修正步骤
1. 定义正确的日期表单类
在forms.py中创建包含日期字段的完整表单:
from django import forms # 复用你定义的DateInput部件 class DateInput(forms.DateInput): input_type = 'date' # 创建实际用于接收日期的表单类 class DateInputForm(forms.Form): date = forms.DateField(widget=DateInput)
2. 修正admin中的QuerySet处理逻辑
在admin.py的milk_record_per_day方法里,按正确流程处理请求:
from django.db.models import functions def milk_record_per_day(self, request): if request.method == "POST": form = forms.DateInputForm(request.POST) # 先验证表单输入是否合法 if form.is_valid(): # 从清洗后的字典中获取日期值 slct_date = form.cleaned_data['date'] # 筛选指定日期的Milk记录 data = models.Milk.objects.filter( milking_date__date=slct_date ).annotate( date=functions.TruncDate("milking_date") ).values( "date" # 可按需添加其他字段,比如"id"、"milk_quantity"等 ) # 后续处理筛选后的数据... else: # 表单验证失败的处理逻辑,比如返回错误提示 pass else: # GET请求时初始化空表单 form = forms.DateInputForm() # 后续返回表单和数据的逻辑...
关键注意点
- 表单验证:必须调用
form.is_valid(),Django才会自动清洗输入数据,将合法值存入cleaned_data字典。 - 日期匹配:
milking_date__date用于匹配DateTimeField字段中的日期部分,和表单传入的纯日期值完全兼容。 - 部件作用:
DateInput仅负责渲染前端的日期输入控件,不能单独作为表单类使用,必须绑定到表单的具体字段上。
内容的提问来源于stack exchange,提问作者Peter Evance
相关产品推荐
相关产品推荐

