Chapter 7-5 Django 블로그 이미지 포토 및 얻어서 생성하는 썸네일 구현

2025. 5. 11. 22:17·Django

📷 Django 블로그 이미지 포토 및 얻어서 생성하는 썸네일 구현

▶️ 이미지가 포함된 게시글을 목록에서 썸네일로 보여주는 기능 구현


✅ 1. 이미지 없는 글 오류 방지 - blog_detail.html 조건문 추가

{% if blog.image %}
    <img src="{{ blog.image.url }}" alt="" class="w-100">
{% endif %}
<p>{{ blog.content | safe }}</p>

🔍 설명:

  • 이미지가 없는 경우에도 에러 없이 페이지가 렌더링되도록 if 조건문 처리
  • blog.image.url은 이미지가 존재할 때만 접근해야 함

🧱 2. models.py에 썸네일 필드 추가

thumbnail = models.ImageField('썸네일', null=True, blank=True, upload_to='blog/%Y/%m/%d/thumbnail')
python manage.py makemigrations
python manage.py migrate

🔍 설명:

  • 원본 이미지와 별개로, 크기가 줄어든 썸네일 이미지를 저장할 공간 설정
  • upload_to로 업로드 경로 분리 (thumbnail 하위 폴더로 저장됨)

📦 3. Pillow 설치

poetry add Pillow
  • 이미지 리사이징 등 Pillow 모듈 필요

🧠 4. 썸네일 자동 생성 - save() 오버라이드

from io import BytesIO
from pathlib import Path
from PIL import Image

class Blog(TimestampModel):
    ...
    def save(self, *args, **kwargs):
        if not self.image:
            return super().save(*args, **kwargs)

        image = Image.open(self.image)
        image.thumbnail((300, 300))  # 최대 300x300 크기로 리사이즈

        image_path = Path(self.image.name)
        thumbnail_name = image_path.stem
        thumbnail_extension = image_path.suffix
        thumbnail_filename = f'{thumbnail_name}_thumb{thumbnail_extension}'

        if thumbnail_extension in ['.jpg', 'jpeg']:
            file_type = 'JPEG'
        elif thumbnail_extension == '.gif':
            file_type = 'GIF'
        elif thumbnail_extension == '.png':
            file_type = 'PNG'
        else:
            return super().save(*args, **kwargs)

        temp_thumb = BytesIO()
        image.save(temp_thumb, file_type)
        temp_thumb.seek(0)

        self.thumbnail.save(thumbnail_filename, temp_thumb, save=False)
        temp_thumb.close()

        return super().save(*args, **kwargs)

🔍 설명:

  • Image.thumbnail()로 이미지 크기 자동 조절
  • 썸네일 이름은 기존 이미지에서 _thumb 접미사 추가하여 생성
  • 임시 메모리(BytesIO)에 썸네일 저장 후, self.thumbnail.save() 호출

🖼️ 5. 목록 페이지에서 썸네일 출력 - blog_list.html

{% if blog.thumbnail %}
    <img src="{{ blog.thumbnail.url }}" alt="" class="col-2">
{% elif blog.image %}
    <img src="{{ blog.image.url }}" alt="" class="col-2">
{% endif %}

🔍 설명:

  • 썸네일이 존재하면 우선 출력, 없으면 원본 이미지 출력
  • 이미지가 없으면 아무것도 출력하지 않음

🔁 6. get_thumbnail_url() 메서드로 로직 분리

def get_thumbnail_url(self):
    if self.thumbnail:
        return self.thumbnail.url
    elif self.image:
        return self.image.url
    return None

🔍 장점:

  • 템플릿에서 조건 분기 없이 blog.get_thumbnail_url 호출만으로 처리 가능
  • 뷰 로직이 간단해지고 재사용성 증가
{% if blog.get_thumbnail_url %}
    <img src="{{ blog.get_thumbnail_url }}" alt="" class="col-2">
{% endif %}

✅ 요약

항목 설명

ImageField 이미지 파일 업로드용 모델 필드
thumbnail 필드 이미지 저장 시 자동 생성되는 축소 이미지
save() 오버라이드 썸네일 생성 및 메모리 저장 처리
템플릿 조건문 이미지 존재 여부에 따라 출력 여부 결정

✅ 테스트용 샘플 이미지 다운로드 사이트:
👉 Pexels 4K 무료 사진


추후 이미지 업로드 시 S3 또는 클라우드 저장소 연동이 필요하면 별도 포스트로 안내해드릴게요. 원하시나요?

'Django' 카테고리의 다른 글

Chapter 8-1 [인스타그램] 회원가입 및 로그인 기능 만들기  (0) 2025.05.12
🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 )  (0) 2025.05.12
Chapter 7-4 Django 블로그 구성에 이미지 업로드 기능 추가하기  (0) 2025.05.11
Chapter 7-3 Django Summernote iframe 메시 구성와 'codeview' 설정의 의의  (0) 2025.05.11
Chapter 7-2 Django 블로그 글 작성/수정 폼에 Summernote 적용하기  (0) 2025.05.11
'Django' 카테고리의 다른 글
  • Chapter 8-1 [인스타그램] 회원가입 및 로그인 기능 만들기
  • 🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 )
  • Chapter 7-4 Django 블로그 구성에 이미지 업로드 기능 추가하기
  • Chapter 7-3 Django Summernote iframe 메시 구성와 'codeview' 설정의 의의
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (758) N
      • Python (32)
      • 프로젝트 (82) N
      • 과제 (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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 7-5 Django 블로그 이미지 포토 및 얻어서 생성하는 썸네일 구현
상단으로

티스토리툴바