Здравствуйте. Осваиваю 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)