Django: TypeError: 'datetime.date' object has no attribute 'get'

Django: TypeError: 'datetime.date' object has no attribute 'get'

我有如下的 TransactionForm:

class TransactionForm(ModelForm):
   start_date = forms.DateField(widget=SelectDateWidget)
   duration = forms.ChoiceField(choices=duration_choices)
   class Meta:
      model=Transaction
      fields=(
         'start_date',
         'duration',
         ) 

   def clean(self):
      date = self.cleaned_data.get("start_date")

      if date < datetime.date.today():
         raise forms.ValidationError("The date cannot be in the past!")
      return date

它有一个方法 clean 检查输入的日期是否至少是今天或更晚。当插入过去的某个日期时,它会按预期在 remplate 上显示错误。但是当输入有效日期时,出现以下错误。

'datetime.date' object has no attribute 'get'

这是我的 view.py 文件

def packages(req):
    if req.method == 'POST':
        form = completeForm(req.POST)
        tf = TransactionForm(req.POST)

        if tf.is_valid():
            return HttpResponse("Some page")
        else:
            errorList = tf.errors['__all__']
            args={'form':form, 'errors':errorList, 'tf':tf}
            return render(req,'main/common/packages.html',args)

    else:   
        form =  completeForm()
        tf = TransactionForm()
        args={'form':form, 'counter':1, 'tf':tf}
        return render(req,'main/common/packages.html',args)

如果我从表单中删除 clean 方法,它可以正常工作,但我需要在不使用 JavaScript 验证的情况下验证日期。

我发现 this 问题最接近我的问题,但它的解决方案对我来说不起作用。请问我做错了什么吗?

您不会对多个字段进行验证,因此我建议尝试使用此方法而不是 def clean(self):

def clean_start_date(self):
    st_date = self.cleaned_data.get("start_date")

    if st_date < datetime.date.today():
        raise forms.ValidationError("The date cannot be in the past!")
    return st_date

编辑:如果您确实尝试验证多个字段,那么 documentation 建议使用自定义清理函数时就是这种情况。