본문 바로가기
Programming/Django

[Python Django] 💥 Django Admin prepopulated_fields 오류 해결기: slug 컬럼 없음 에러

by Mandy's 2025. 7. 23.

Django 프로젝트에서 Book과 Author 모델을 만들고, slug 필드를 자동 생성하려고 할 때 prepopulated_fields 설정 중 다음과 같은 에러를 만났습니다.

❗ 에러 메시지

OperationalError: no such column: book_outlet_author.slug

Admin 페이지에서 /admin/book_outlet/book/에 접근하자마자 위와 같은 500 오류가 발생했습니다.

🔎 원인 분석

이 에러는 models.py에 Author.slug 필드를 추가했지만, makemigrations 및 migrate를 하지 않아 DB 테이블에 컬럼이 생성되지 않았기 때문입니다.
Django는 admin 페이지에서 slug 값을 조회하려고 시도하지만, DB에는 해당 필드가 존재하지 않아 에러를 던진 것이죠.

✅ 해결 방법

1. models.py에서 slug 필드 및 자동 생성 로직 추가

from django.utils.text import slugify

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    slug = models.SlugField(default="", blank=True, null=False, db_index=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(f"{self.first_name}-{self.last_name}")
        super().save(*args, **kwargs)

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

slugify를 사용해 first_name과 last_name을 기반으로 slug를 자동 생성합니다.

2. admin.py에서 prepopulated_fields 설정

class AuthorAdmin(admin.ModelAdmin):
    readonly_fields = ("slug",)
    prepopulated_fields = {"slug": ("first_name", "last_name")}

3. 마이그레이션 적용

python manage.py makemigrations
python manage.py migrate

이 과정을 통해 모델 변경 사항이 실제 DB 테이블에도 반영됩니다.

🧪 결과 확인

  • Admin 페이지에서 Author를 추가할 때, 이름 입력만으로 slug 필드가 자동으로 채워집니다.
  • /admin/book_outlet/book/ 페이지에서 더 이상 500 에러가 발생하지 않고 정상 작동합니다.
  • Book 모델도 동일한 방식으로 slug 자동 생성 및 등록 완료했습니다.

💡 마무리 팁

  • Django에서 모델 필드를 추가하거나 수정했다면 반드시 makemigrations, migrate를 통해 DB에도 반영해야 합니다.
  • 특히 admin에서 prepopulated_fields를 사용할 경우, 해당 필드가 DB에 실제 존재해야 하므로 꼭 확인하세요!

하지만 이런 방식으로 하지 않고 간단하게 해결하는 방법이 있습니다. 

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def full_name(self):
        return f"{self.first_name} {self.last_name}"

    def __str__(self):
        return self.full_name()

slug를 활용하지 않는 경우, 단지 이 코드만 추가하면 동일하게 작성하는 것을 알 수 있습니다. 

-> AUTHOR 만 띄우는 경우 <-

 

slug는 언제 활용해야 할까요? -- 다음 포스팅에서 계속