Django - отображение сообщения об ошибке при недействительности формы с помощью "CreateView"
Вот мой упрощенный "ProjectCreate" ClassBasedView :
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
fields = ['name', 'creation_date', 'price']
class ProjectCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = Project
form_class = ProjectForm
success_message = "Project successfully created"
success_url = "project-list"
def get_form(self, form_class=None):
form = super(ProjectCreate, self).get_form(form_class)
form.fields.pop('creation_date')
return form
def form_valid(self, form):
if form.instance.name == "not_valid_name":
return super().form_invalid(form)
form.instance.last_editor = self.request.user
form.instance.last_modification_date = datetime.datetime.now()
return super().form_valid(form)
Я хочу создавать проект, только если имя не является "not_valid_name"
Если имя "not_valid_name", я хочу вывести сообщение об ошибке (говорящее, что имя недействительно), и вернуть пользователя на страницу 'создания проекта'
Если вам нужна дополнительная информация для понимания моей проблемы, не стесняйтесь спросить меня.
Спасибо :)
Вы можете достичь этого на разных уровнях:
- на уровне
Form
: здесь находится ссылка на соответствующую страницу в документации. Вкратце, используйте методclean
поляname
, следующий код должен быть прост для понимания:
from django import forms
from ??? import Project
class ProjectForm(forms.ModelForm):
# I assume you already have some code here
def clean_name(self):
name = self.cleaned_data.get("name")
if name in ["invalid_name_1", "invalid_name_2"]: # etc.
raise ValidationError("Forbidden value for this field.")
return name
class Meta(forms.ModelForm.Meta):
model = Project
С этим кодом (и еще несколькими строками в шаблоне) клиент увидит вот что:
- на уровне
Model
: вы можете использовать пользовательский валидатор. Проверьте эту страницу для получения дополнительной информации, она довольно хорошо написана. - на уровне
View
, как вы пытались сделать, должен быть способ, но я думаю, что это не лучшее решение, потому что чище держать логику валидации в форме и полях модели. Причина этого, например, в том, что вы можете захотеть сохранить то же самое ограничение в приложенииadmin
при редактировании экземпляровProject
. Вот подсказка, если вы предпочитаете эту альтернативу: на этой странице перечислены все доступные & полезные методы вCreateView
.