Chapter 7-4 Django 블로그 구성에 이미지 업로드 기능 추가하기

2025. 5. 11. 22:15·Django

🖼 Django 블로그 구성에 이미지 업로드 기능 추가하기


✅ 1. models.py 에 ImageField 추가

# 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):
    CATEGORY_CHOICES = (
        ('free', '자유'),
        ('travel', '여행'),
        ('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)

    # ✅ 이미지 필드 추가
    image = models.ImageField('이미지', null=True, blank=True, upload_to='blog/%Y/%m/%d')
  • upload_to='blog/%Y/%m/%d': 미디어 폴더 내 날짜별로 저장되도록 지정

💾 마이그레이션 반영

python manage.py makemigrations
python manage.py migrate

📦 2. Pillow 라이브러리 설치 (이미지 처리 백엔드)

poetry add Pillow

🧾 3. forms.py - 이미지 필드 포함

# forms.py

from django import forms
from django_summernote.widgets import SummernoteWidget
from blog.models import Blog, Comment

class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ('category', 'title', 'image', 'content')  # ✅ image 필드 포함
        widgets = {
            'content': SummernoteWidget()
        }

🖊 4. blog_form.html 수정 (파일 업로드 가능하게)

{# blog_form.html #}

<form method="POST" enctype="multipart/form-data">  <!-- ✅ 필수 설정 -->
  {% csrf_token %}
  {{ form.as_p }}
  <button class="btn btn-primary">
    {% if btn_name %}{{ btn_name }}{% else %}저장{% endif %}
  </button>
</form>
  • enctype="multipart/form-data": 파일 업로드시 반드시 설정해야 하는 속성

🧩 5. views.py - 이미지 필드 검증 추가

# cb_views.py (일부 발췌)

class BlogUpdateView(LoginRequiredMixin, UpdateView):
    model = Blog
    template_name = 'blog_form.html'
    form_class = BlogForm

    def get_queryset(self):
        queryset = super().get_queryset()
        if self.request.user.is_superuser:
            return queryset
        return queryset.filter(author=self.request.user)

    # ✅ form 유효성 검사 시 데이터 확인
    def form_valid(self, form):
        print(form.cleaned_data)  # 이미지 포함 확인
        return super().form_valid(form)

📄 6. blog_list.html - 목록에서 이미지 출력

{# blog/blog_list.html #}

{% for blog in object_list %}
  <a href="{% url 'blog:detail' blog.pk %}" class="row">
    {% if blog.image %}
      <img src="{{ blog.image.url }}" alt="" class="col-2">
    {% endif %}
    <span class="col-10">
      [{{ blog.get_category_display }}] {{ blog.title }} - {{ blog.created_at|date:"Y-m-d" }}
    </span>
  </a>
{% endfor %}
  • 조건문으로 이미지가 있을 경우만 출력

📑 7. blog_detail.html - 상세 페이지에 이미지 출력

{# blog_detail.html #}

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

<p>{{ blog.content | safe }}</p>

🧠 요약

항목 설명

models.py ImageField로 이미지 업로드 경로 지정
forms.py 이미지 필드 추가
views.py form_valid()에 유효성 출력 코드 추가 가능
template enctype="multipart/form-data", {{ blog.image.url }} 사용

이미지 업로드 시 미디어 경로 설정(MEDIA_URL, MEDIA_ROOT) 과 urls.py에 static/media 설정이 선행되어 있어야 합니다. 필요하시면 그 설정도 이어서 정리해드릴게요!

'Django' 카테고리의 다른 글

🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 )  (0) 2025.05.12
Chapter 7-5 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
Chapter 7-1 Django 블로그 이미지 업로드 기능 만들기  (0) 2025.05.11
'Django' 카테고리의 다른 글
  • 🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 )
  • Chapter 7-5 Django 블로그 이미지 포토 및 얻어서 생성하는 썸네일 구현
  • Chapter 7-3 Django Summernote iframe 메시 구성와 'codeview' 설정의 의의
  • Chapter 7-2 Django 블로그 글 작성/수정 폼에 Summernote 적용하기
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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 7-4 Django 블로그 구성에 이미지 업로드 기능 추가하기
상단으로

티스토리툴바