반응형
Django에서 파일 업로드 처리 (ImageField, FileField)
Django에서 파일을 업로드하는 기능은 FileField와 ImageField를 사용하여 간단하게 구현할 수 있습니다. 이 글에서는 Django의 파일 업로드 기능을 활용하는 방법을 단계별로 설명하겠습니다.
1. Django 프로젝트 및 앱 생성
파일 업로드 기능을 구현하기 위해 Django 프로젝트와 앱을 생성합니다.
mkdir django_file_upload
cd django_file_upload
python -m venv venv
source venv/bin/activate # Windows에서는 venv\Scripts\activate
pip install django
django-admin startproject myproject
cd myproject
django-admin startapp myapp
Django 프로젝트와 앱을 생성한 후, myapp을 프로젝트의 INSTALLED_APPS에 추가합니다.
# myproject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
2. 모델(Model) 정의
Django에서 파일을 저장하려면 모델에서 FileField 또는 ImageField를 정의해야 합니다.
# myapp/models.py
from django.db import models
class Document(models.Model):
title = models.CharField(max_length=255)
file = models.FileField(upload_to='uploads/')
class Image(models.Model):
title = models.CharField(max_length=255)
image = models.ImageField(upload_to='images/')
upload_to옵션은 업로드된 파일이 저장될 경로를 지정합니다.FileField는 모든 유형의 파일을 저장할 수 있습니다.ImageField는 이미지 파일만 업로드할 수 있으며,Pillow라이브러리가 필요합니다.
pip install pillow
마이그레이션을 생성하고 적용합니다.
python manage.py makemigrations myapp
python manage.py migrate
3. 폼(Form) 생성
Django의 forms.ModelForm을 사용하여 파일 업로드 폼을 생성합니다.
# myapp/forms.py
from django import forms
from .models import Document, Image
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ('title', 'file')
class ImageForm(forms.ModelForm):
class Meta:
model = Image
fields = ('title', 'image')
4. 뷰(View) 및 템플릿 작성
뷰(View) 구현
views.py에서 파일 업로드를 처리하는 뷰를 작성합니다.
# myapp/views.py
from django.shortcuts import render, redirect
from .forms import DocumentForm, ImageForm
from .models import Document, Image
def upload_file(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('upload_success')
else:
form = DocumentForm()
return render(request, 'upload_file.html', {'form': form})
def upload_image(request):
if request.method == 'POST':
form = ImageForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('upload_success')
else:
form = ImageForm()
return render(request, 'upload_image.html', {'form': form})
def upload_success(request):
return render(request, 'upload_success.html')
URL 설정
urls.py에 URL 패턴을 추가합니다.
# myapp/urls.py
from django.urls import path
from .views import upload_file, upload_image, upload_success
urlpatterns = [
path('upload/file/', upload_file, name='upload_file'),
path('upload/image/', upload_image, name='upload_image'),
path('upload/success/', upload_success, name='upload_success'),
]
템플릿 작성
upload_file.html
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">파일 업로드</button>
</form>
upload_image.html
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">이미지 업로드</button>
</form>
upload_success.html
<p>파일이 성공적으로 업로드되었습니다!</p>
<a href="/upload/file/">다시 업로드</a>
5. 미디어 파일 설정
파일이 실제로 저장될 위치를 설정해야 합니다. settings.py에서 미디어 파일 설정을 추가합니다.
# myproject/settings.py
import os
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
또한 urls.py에서 미디어 파일을 서빙할 수 있도록 설정해야 합니다.
# myproject/urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
6. Django 개발 서버 실행 및 테스트
python manage.py runserver
웹 브라우저에서 http://127.0.0.1:8000/upload/file/ 또는 http://127.0.0.1:8000/upload/image/로 이동하여 파일 업로드 기능을 테스트할 수 있습니다.
7. 결론
이 글에서는 Django에서 FileField와 ImageField를 사용하여 파일 업로드를 처리하는 방법을 설명하였습니다. Django의 강력한 폼과 모델 기능을 활용하여 쉽고 효율적으로 파일 업로드 기능을 구현할 수 있습니다.
반응형
'Python > Django' 카테고리의 다른 글
| Django 미들웨어 개념과 활용법 (0) | 2025.11.07 |
|---|---|
| Django에서 사용자 인증(Authentication) 시스템 구축하기 (0) | 2025.11.06 |
| Django ModelForm을 이용한 사용자 입력 처리 (0) | 2025.11.04 |
| Django Form 기본 개념 및 활용법 (forms.py) (0) | 2025.11.03 |
| Django Admin 사이트 설정 및 커스터마이징 (admin.py) (0) | 2025.11.02 |