Chapter 9-1 Django Post 기능 구현하기

2025. 5. 14. 15:10·Django

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
'Django' 카테고리의 다른 글
  • Chapter 9-3 Django Post 목록 무한 스크롤 만들기
  • Chapter 9-2 Django Post 목록 페이지 만들기
  • 🔍 Django에서 User.objects.model의 정체는?
  • Chapter 8-6 Mini Project: Django Login & Logout 기능 만들기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (727) N
      • Python (32)
      • 프로젝트 (55) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41) N
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5) N
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (10) N
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    urbantrends
    뷔
    foodshortage
    basalcellcarcinoma
    bts
    homebartrend
    evoo
    trumpmuskclash
    galaxys25ultra
    classaction
    livebroadcast
    titaniumcase
    뷔전역
    youngprofessionals
    newpoliticalparty
    smartphonedurability
    militarydischarge
    RM
    skincancerawareness
    oliveoilhealth
    hotcoffeecase
    뷔제대
    chansmannewspick
    americanlaw
    chinanightlife
    japanricecrisis
    btsreunion
    lawsuitculture
    globaleconomy
    americaparty
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 9-1 Django Post 기능 구현하기
상단으로

티스토리툴바