Chapter 9-1 Django Post 기능 구현하기
1️⃣ 목표 개요
이번 장에서는 게시글(Post) 기능을 구현합니다. 핵심 요소는 다음과 같습니다:
- 글 내용 (텍스트 필드)
- 작성자 (User 모델과의 관계)
- 이미지 여러 장 (PostImage 모델로 관리)
- 작성일자 및 수정일자 (공통 필드로 추출하여 추상 클래스화)
2️⃣ TimestampModel로 공통 필드 관리하기
📌 중복 방지 및 코드 재사용을 위해 TimestampModel 이라는 추상 클래스를 utils 앱에 정의해 둡니다.
- 생성 시간(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 # 실제 테이블로 생성되지 않음
이 클래스를 상속받으면, 각각의 모델에서 중복 없이 공통 필드를 자동으로 사용할 수 있습니다.
3️⃣ Post 모델 정의하기
✔️ 구현 코드
# post/models.py
from django.contrib.auth import get_user_model
from django.db import models
from utils.models import TimestampModel
User = get_user_model()
class Post(TimestampModel):
content = models.TextField('본문')
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f'[{self.user}] post'
class Meta:
verbose_name = '포스트'
verbose_name_plural = '포스트 목록'
🧩 주요 설명
- TextField: 본문은 길이 제한 없는 텍스트로 구성됩니다.
- ForeignKey(User): 작성자 정보는 사용자와 연결됩니다.
- on_delete=models.CASCADE: 사용자가 삭제되면 해당 게시글도 함께 삭제됩니다.
- __str__ 메서드: 관리자 페이지 등에서 객체 식별을 쉽게 하기 위한 문자열 표현
- Meta: 관리자(admin)에서의 이름 설정
4️⃣ PostImage 모델 정의하기
✔️ 구현 코드
class PostImage(TimestampModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
image = models.ImageField('이미지', upload_to='post/%Y/%m/%d')
def __str__(self):
return f'{self.post} image'
class Meta:
verbose_name = '이미지'
verbose_name_plural = '이미지 목록'
🧩 주요 설명
- ForeignKey(Post): 여러 이미지를 하나의 게시글에 연결하기 위해 다대일(FK) 구조
- ImageField: 이미지 업로드 경로는 post/년/월/일 형식으로 지정
- upload_to는 MEDIA 설정이 필요함
post/admin.py 설정
from django.contrib import admin # ✅ 정답: admin 전체에서 불러와야 함
from post.models import PostImage, Post
class PostImageInline(admin.TabularInline):
model = PostImage
fields = ['image']
extra = 1
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
inlines = [
PostImageInline,
]
member/admin.py 설정
from django.contrib import admin
from member.models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
...
urls.py 설정
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
settings.py 설정
MEDIA_URL = 'media/'
MEDIA_ROOT = BASE_DIR / 'media'
5️⃣ 실전 꿀팁 💡
- 📁 이미지 업로드를 위해 MEDIA_ROOT, MEDIA_URL 설정이 필수입니다.
- 🛠 ImageField를 사용하려면 Pillow 라이브러리가 설치되어 있어야 합니다:
- pip install Pillow
- 📷 하나의 게시글에 여러 이미지를 업로드하려면 PostImage와 inline formset 등을 활용해 폼을 구성해야 함
✅ 요약
항목 내용
모델 이름 | Post, PostImage |
핵심 관계 | Post 1 : N PostImage |
공통 필드 | TimestampModel로 상속 처리 |
작성자 연결 | get_user_model() + FK 사용 |
이미지 저장 방식 | ImageField + 업로드 경로 설정 |
다음 단계에서는 이 모델을 기반으로 Post 등록/조회/수정 기능을 구현해 나갑니다 🔧
'Django' 카테고리의 다른 글
Chapter 9-3 Django Post 목록 무한 스크롤 만들기 (0) | 2025.05.14 |
---|---|
Chapter 9-2 Django Post 목록 페이지 만들기 (0) | 2025.05.14 |
🔍 Django에서 User.objects.model의 정체는? (0) | 2025.05.12 |
Chapter 8-6 Mini Project: Django Login & Logout 기능 만들기 (0) | 2025.05.12 |
Chapter 8-5 Django 이메일 인증을 위한 SMTP 설정 가이드 (0) | 2025.05.12 |