@IvanGeso
Релейщик

Как правильно обработать IntegrityError в форме Django?

Здравствуйте. Осваиваю Django 2 (пишу первый проект на этом фреймворке) и у меня возникла проблема, которая наверняка решается просто, однако гугление пока не помогло.

Суть проблемы в следующем: имеется модель, отвечающая за категорию товара со следующими полями:
class Category(models.Model):
    category = models.CharField(max_length=80)
    slug = models.SlugField(max_length=50, unique=True, blank=True)


Сначала я создал форму для создания новой категории, в которой было два поля в соответствии с моделью. Т.е. слаг задавался руками. Ошибки в форме для такого случая я обрабатывал следующим образом:
if Category.objects.filter(slug__iexact=new_slug).count():
        raise ValidationError(f'Категория "{self.cleaned_data.get("category")}" уже существует')


Однако каждый раз задавать слаг руками - не лучший выбор. Поэтому была написана функция gen_slug, которая для англоязычных категорий просто использует встроенную в Django функцию slugify, а в случае с русскоязычной категорией делает транслитизацию.

После того, как я реализовал этот функционал я решил убрать поле слага из формы создания категории. И теперь естественно получаю IntegrityError при попытке создания категории, которая уже есть в БД.

Подскажите пожалуйста, каким образом эту ошибку можно обработать таким образом, чтобы она отображалась алертом в форме, как у меня это было реализовано для формы с двумя полями?

Код формы:
class CategoryForm(forms.ModelForm):

    class Meta:
        model = Category
        fields = ['category']  # в первоначальном варианте тут был еще и 'slug' 
        widgets = {field: forms.TextInput(attrs={'class': 'form-control'}) for field in fields}

    def clean_slug(self):
        new_slug = self.cleaned_data.get('slug').lower()
        if new_slug == 'create':
            raise ValidationError('Slug не может иметь значение "create"!')
        if Category.objects.filter(slug__iexact=new_slug).count():
            raise ValidationError(f'Категория "{self.cleaned_data.get("category")}" уже существует')
        return new_slug


Код вьюхи:
class CategoryCreate(View):
    def get(self, request):
        form = CategoryForm()
        data = {'title': 'Создание новой категории',
                'form': form,
                }
        return render(request, 'create_cat.html', context=data)

    def post(self, request):
        bound_form = CategoryForm(request.POST)
        if bound_form.is_valid():
            new_cat = bound_form.save()
            return redirect(new_cat)
  • Вопрос задан
  • 780 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы