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 建议使用自定义清理函数时就是这种情况。
我有如下的 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 建议使用自定义清理函数时就是这种情况。