J, J Blog
[Django] Slug 필드가 중복되어 발생하는 오류(Unique Constraint) 본문
다음과 같이 설정하면 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)
"""
'Programming > Django' 카테고리의 다른 글
[Django] 템플릿(templates)에서 사용하는 admin url (0) | 2020.01.18 |
---|---|
[Django] django-imagekit 을 사용해 썸네일 만들기 (0) | 2020.01.16 |
[Django] admin 페이지로 이동하는 url name (0) | 2020.01.14 |
[Django] django-allauth 커스터마이징하기 (0) | 2020.01.08 |
[Django] Category 만들기 (0) | 2020.01.02 |