🖼 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 |