Почему form._errors работает в generic.Просмотр обновлений, но не в generic.CreateView?

#python #django #django-forms #mixins

#python #django #django-forms #смешивания

Вопрос:

Когда я использую это в своих миксах

 form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["age must be positive"])
  

в моем UpdateView это работает, и сообщение отображается красным цветом. Но в моем CreateView ничего не выскакивает

Как я могу этого добиться? Вот мой mixin.py:

 class AgePositiveMixin(object):
    def form_valid(self, form):
        print(form.instance.age)
        if form.instance.age>0:
            return super(AgePositiveMixin, self).form_valid(form)
        else:
            form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["Age must be positive"])
          # raise forms.ValidationError('Age must be positive')
        return self.form_invalid(form)
  

Ответ №1:

У CreateView нет instance объекта, потому что объект еще не существует на момент создания формы. Вместо form.instance вы можете сделать это:

 instance = form.save(commit=False)
# perform validation here
instance.save()
return super(AgePositiveMixin, self).form_valid(form)
  

Предполагается ли, что возраст везде положительный (в формах администратора Django, обращенных к пользователю)? Если это так, то a PositiveSmallIntegerField выполнит эту проверку за вас.

В общем, мне нравится проводить проверки как можно ближе к базе данных. Если это PositiveSmallIntegerField не соответствует вашему варианту использования, я бы рекомендовал использовать валидатор. С помощью валидаторов Django выполнит проверку для вас в admin, model forms и где угодно еще. Это отлично подходит для согласованности.

Редактировать: еще один способ выполнить проверку — сделать это в классе form:

 class UserForm(forms.ModelForm):
    class Meta:
        model = User

    def clean_age(self):
        age = self.cleaned_data['age']
        if not age > 0:
            raise forms.ValidationError("Age must be positive")
        return age
  

Ознакомьтесь с документами Django по форме и проверке полей для получения дополнительной информации об этом.

Комментарии:

1. спасибо за ответ. Я знаю о PositiverField в модели, но я просто хочу показать сообщение об ошибке, этот код не настоящий, это просто пример. Я прочитаю документ проверки, обновляющий фактически поле age, я могу прочитать его и распечатать, чтобы проверить, является ли оно положительным, и остановить проверку формы, вызвав form_invalid. Моя проблема просто в отображении сообщения. Должен быть способ сделать это. Например, если выполняется сбой ограничения unique, появляется встроенное сообщение. Я хочу сделать то же самое с пользовательским условием

2. @CHEMSEDDINEHAROUIT Если использование средства проверки у вас не работает, вы можете выполнить проверку для этого поля, которое находится в самом классе form. Я обновлю свой ответ.

3. Я пробовал с проверкой clean_age (), но она не работает (даже при отрицательном возрасте объекта создается)

4. Именно то, что мне было нужно, спасибо (моя ошибка заключалась в том, что clean_age() был внутри Meta.

5. @CHEMSEDDINEHAROUIT Рад, что смог помочь!