💬 Chapter 06. 댓글 기능 시작하기 - 모델과 관리자 설정
🎯 목표
블로그 글에 달리는 댓글(Comment) 모델을 정의하고, Admin 페이지에서 관리할 수 있도록 설정합니다. 또한, 코드 흐름에 따라 모델 확장 구조를 이해합니다.
1️⃣ 댓글 모델 정의하기 (models.py)
✅ 흐름 설명
- 댓글은 블로그 글(Blog)과 연결됩니다. 하나의 블로그 글에는 여러 댓글이 달릴 수 있으므로, ForeignKey를 사용해 다대일 관계 설정
- 작성자(author)는 Django 기본 유저 모델을 참조
- TimestampModel을 상속받아 댓글 작성 및 수정 일시를 자동으로 기록
# blog/models.py
from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
from utils.models import TimestampModel # 날짜 정보 자동 생성
User = get_user_model()
class Blog(TimestampModel): # 기존의 model,Model에서 변경
CATEGORY_CHOICES = (
('free', '자유'),
('travle', '여행'),
('cat', '고양이'),
('dog', '강아지')
)
category = models.CharField('카테고리', max_length=10, choices=CATEGORY_CHOICES, default='free')
title = models.CharField('제목', max_length=100)
content = models.TextField('본문')
# ✅ 작성자 필드 추가
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f'[{self.get_category_display()}] {self.title[:10]}'
def get_absolute_url(self):
return reverse('blog:detail', kwargs={'pk': self.pk})
class Meta:
verbose_name = '블로그'
verbose_name_plural = '블로그 목록'
class Comment(TimestampModel):
blog = models.ForeignKey('Blog', on_delete=models.CASCADE)
content = models.CharField('본문', max_length=255)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f'{self.blog.title} 댓글'
class Meta:
verbose_name = '댓글'
verbose_name_plural = '댓글 목록'
2️⃣ 공통 일자 필드 구성 (utils/models.py)
✅ 흐름 설명
- TimestampModel은 추상 모델 클래스입니다.
- 다른 모델에서 상속받으면, 생성일자(created_at)와 수정일자(updated_at)가 자동으로 생성됩니다.
# utils/models.py
from django.db import models
class TimestampModel(models.Model):
created_at = models.DateTimeField('작성일자', auto_now_add=True)
updated_at = models.DateTimeField('수정일자', auto_now=True)
class Meta:
abstract = True # DB 테이블로 생성되지 않음
3️⃣ 마이그레이션 적용
$ python manage.py makemigrations
$ python manage.py migrate
✔️ 모델 정의를 DB 테이블로 반영합니다.
4️⃣ Admin에 댓글 인라인으로 등록하기 (admin.py)
✅ 흐름 설명
- 댓글은 블로그 글과 연결되어 있으므로, TabularInline을 통해 블로그 편집 화면에서 댓글도 함께 관리 가능하도록 설정합니다.
- extra=1은 빈 댓글 입력 필드 하나를 기본 표시
# blog/admin.py
from django.contrib import admin
from blog.models import Blog, Comment
admin.site.register(Comment) # 댓글도 별도로 등록 가능
class CommentInline(admin.TabularInline):
model = Comment
fields = ['content', 'author']
extra = 1
@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
inlines = [CommentInline]
📌 결과적으로 블로그 관리 화면에서 댓글도 한 번에 관리 가능해져 운영이 매우 편리해집니다.
✅ 요약 정리
- 댓글(Comment)은 블로그 글과 연결되며, 사용자와 본문 정보를 가짐
- TimestampModel을 상속해 자동 일자 처리
- Admin에서는 TabularInline으로 블로그 글과 함께 댓글을 표시하여 효율적인 관리 가능
👉 다음 단계에서는 댓글을 직접 입력하고 출력하는 기능으로 넘어갑니다!
'Django' 카테고리의 다른 글
Chapter 6-5 댓글 페이지네이션 구현하기 (ListView + Bootstrap) (0) | 2025.05.09 |
---|---|
Chapter 6-4 Django 블로그에 댓글 기능 추가하기 (0) | 2025.05.09 |
Chapter 6-2 Bootstrap 적용으로 블로그 UI 개선하기 (0) | 2025.05.09 |
Chapter 6-1 [블로그] 댓글 기능 만들기 - Static Files 설정과 Bootstrap 적용 (0) | 2025.05.09 |
Chapter 5-8 📌 Mini Project - Admin 권한으로 모든 게시글 수정/삭제 가능하게 만들기 (0) | 2025.05.08 |