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

С этим кодом (и еще несколькими строками в шаблоне) клиент увидит вот что: example_bootstrap5

  • на уровне Model: вы можете использовать пользовательский валидатор. Проверьте эту страницу для получения дополнительной информации, она довольно хорошо написана.
  • на уровне View, как вы пытались сделать, должен быть способ, но я думаю, что это не лучшее решение, потому что чище держать логику валидации в форме и полях модели. Причина этого, например, в том, что вы можете захотеть сохранить то же самое ограничение в приложении admin при редактировании экземпляров Project. Вот подсказка, если вы предпочитаете эту альтернативу: на этой странице перечислены все доступные & полезные методы в CreateView.
Вернуться на верх