Django ModelForms忽略了一个干净的字段方法

时间:2018-04-25 08:21:55

标签: django django-models django-forms

我有以下模型,我有一个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')

ModelForm:

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方法,而是对Model a进行验证失败,所以这就是为什么我需要clean来更改日期格式才能保存。

1 个答案:

答案 0 :(得分:1)

如果您想更改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方法永远不会运行。您可以阅读有关验证顺序的更多信息in the docs。请注意,您不应该使用strptime clean_*方法运行DateField - cleaned_data中的值已经是该点的日期。< / p>