Django ModelForms игнорирует метод чистого поля - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующая модель, где у меня есть 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 игнорирует метод clean для start_date, но учитывает методы очистки для других полей.

Поэтому я использую отладчик для проверки и вижу, что оно появляется в 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, вместо этого проверка на модели не выполняется, поэтому мне нужно очистить, чтобы изменить формат даты перед сохранением.

1 Ответ

0 голосов
/ 25 апреля 2018

Если вы хотите изменить форматы даты для 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 никогда не запускается.Вы можете прочитать больше о порядке проверки в документации .Обратите внимание, что вам не нужно запускать strptime в методе clean_* для DateField - значение в cleaned_data к этому моменту уже будет датой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...