slugify
не проверяет уникальность, поэтому, если вы создадите две статьи с одинаковым названием, slugify(self.title)
собирается сгенерировать один и тот же слаг дважды, что, конечно, заставит базу данных пожаловаться на нарушение уникальногоограничение.
Установка unique = True
для поля не будет автоматически создавать уникальные значения для каждого нового экземпляра, она только создаст ограничение для базы данных, что одно и то же значение не может быть сохранено дважды.
Вы можете использовать django-autoslug , которая является библиотекой, которая делает именно то, что вам нужно.
Просто установите пакет и реализуйте свои поля следующим образом:
from django.db.models import CharField, Model
from autoslug import AutoSlugField
class Content(models.Model)
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
AutoSlugField
выполняет следующие действия:
- заполняет себя из другого поля,
- сохраняет уникальность значения и
- использует настраиваемое slugify() работает лучше для i18n.
(Кроме того, я предполагаю, что Content
является подклассом Model
, иначе ваш код не будет работать вообще.)