我有以下模型,其中有一个 DateField:
class E(models.Model):
name = models.CharField(max_length=255
description = models.TextField(max_length=255)
start_date = models.DateField(verbose_name='Start Date')
模型形式:
class EventModelForm(forms.ModelForm):
class Meta:
model = Event
fields = ['name', 'description','start_date']
def clean_start_date(self):
datetime_format = '%a %b %d %Y'
start_date = self.cleaned_data['start_date']
return datetime.strptime(start_date, datetime_format)
我的问题是 Django 忽略了 start_date 的 clean 方法,但考虑了其他字段的 clean 方法。
所以我使用调试器来检查,我看到它出现在 中change_data
,但没有出现在cleaned_data
changed_data: <class 'list'>: [name', 'description', ''start_date']
cleaned_data: name, description
这很奇怪,所以我检查了输入,看起来没问题:
<input name="start_date" class="c-fi' type="text">
我不明白为什么不调用 clean 方法,而是对模型 a 进行验证失败,所以这就是为什么我需要 clean 在保存之前更改日期格式。
如果要更改 的日期格式DateField
,则应input_formats
改为设置。
class EventModelForm(forms.ModelForm):
start_date = forms.DateField(
verbose_name='Start Date',
input_formats=['%a %b %d %Y'],
)
class Meta:
model = Event
fields = ['name', 'description','start_date']
由于您没有在字段中包含自定义格式,因此该字段本身会引发验证错误,因此该clean_start_date
方法永远不会运行。您可以在 docs 中阅读有关验证顺序的更多信息。请注意,您不必strptime
在 a 的clean_*
方法中运行DateField
- 到cleaned_data
那时,in 中的值已经是一个日期。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句