Chapter 6-3 댓글 기능 시작하기 - 모델과 관리자 설정

2025. 5. 9. 10:06·Django

💬 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
'Django' 카테고리의 다른 글
  • Chapter 6-5 댓글 페이지네이션 구현하기 (ListView + Bootstrap)
  • Chapter 6-4 Django 블로그에 댓글 기능 추가하기
  • Chapter 6-2 Bootstrap 적용으로 블로그 UI 개선하기
  • Chapter 6-1 [블로그] 댓글 기능 만들기 - Static Files 설정과 Bootstrap 적용
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    college reunions
    btsdischarge
    remittance
    basalcellcarcinoma
    life reflection
    titaniumcase
    americaparty
    self-growth
    classaction
    americanlaw
    youngprofessionals
    뷔
    chinanightlife
    livebroadcast
    smartphonedurability
    chatgpterror
    btsjungkook
    travel ban
    trumpmuskclash
    btscomeback
    gpterror
    homebartrend
    lawsuitculture
    hotcoffeecase
    global politics
    RM
    bts
    urbantrends
    newpoliticalparty
    btsreunion
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 6-3 댓글 기능 시작하기 - 모델과 관리자 설정
상단으로

티스토리툴바