You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Django表单的日期输入值传递给QuerySet筛选?

解决表单日期筛选QuerySet的问题

问题根源

你遇到的'DateInput' object has no attribute 'date'错误,核心原因有两个:

  1. 表单类定义错误:DateInput是Django表单的部件(widget),并非完整的表单类,不能直接用来接收请求数据。
  2. 取值方式错误:即便表单类正确,也不能直接通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:25:35