J, J Blog

[Django] Slug 필드가 중복되어 발생하는 오류(Unique Constraint) 본문

Programming/Django

[Django] Slug 필드가 중복되어 발생하는 오류(Unique Constraint)

J, J 2020. 1. 16. 04:59

다음과 같이 설정하면 admin.py에서 prepopulated_fields 를 설정하지 말 것!

# generate_unique_slug 함수를 선언하고, 적용하고자 하는 모델에 save 함수를 오버라이딩한다.


from django.utils.text import slugify


def generate_unique_slug(klass, field):
    """
    return unique slug if origin slug is exist.
    eg: `foo-bar` => `foo-bar-1`

    :param `klass` is Class model.
    :param `field` is specific field for title.
    """
    origin_slug = slugify(field, allow_unicode=True)
    unique_slug = origin_slug
    numb = 1
    while klass.objects.filter(slug=unique_slug).exists():
        unique_slug = '%s-%d' % (origin_slug, numb)
        numb += 1
    return unique_slug

"""
# USAGE EXAMPLE

from django.db import models
from django.contrib.auth.models import User
from myapp.utils import generate_unique_slug

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True)

    def save(self, *args, **kwargs):
        if self.slug:  # edit
            if slugify(self.title, allow_unicode=True) != self.slug:
                self.slug = generate_unique_slug(Post, self.title)
        else:  # create
            self.slug = generate_unique_slug(Post, self.title)
        super(Post, self).save(*args, **kwargs)
"""