#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 Рад, что смог помочь!