사용자가 웹에서 업로드하는 정적 파일(image, pdf, video 등)을 media files 라고 한다.
MEDIA_URL 및 STATIC_URL 은 서로 다른 값을 가져야 한다.
settings.py 에 작성해야 할 내용
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'
+ project 폴더의 urls.py 에도 아래와 같은 코드를 작성해야 함
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('posts/', include('posts.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
media 파일을 컬럼으로 가지는 model을 만들어보자.
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
image = models.ImageField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
기본적으로 위와 같이 작성해주면, 이미지 파일을 입력받을 수 있다.
하지만 이렇게만 작성한다면 아래 사진과 같이 미디어 폴더 아래에 사진이 나열된다는 단점이 있다.
코드를 추가해서 사진이 폴더를 만들어 저장되게 해보겠다.
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
image = models.ImageField(blank=True)
image = ProcessedImageField(upload_to='images/%Y/%m/%d',
processors=[ResizeToFill(500, 500)],
format='JPEG',
options={'quality': 100})
created_at = models.DateTimeField(auto_now_add=True)
ProcessedImageField
를 import 해서 위의 코드를 추가한다면, 사진이 저장되는 경로를 지정할 수 있고, 사진의 크기를 조정할 수 있고(단, ResizeToFill
import 해야 함), 화질의 퀄리티를 조정할 수도 있다.(100의 경우 원본과 비슷한 화질)
아까와 달리 media 폴더 아래에 images/년도/월
폴더가 생성되고, 그 아래에 날짜별로 폴더가 생성되어 거기에 사진이 저장되는 것을 볼 수 있다. 또한, olaf 사진은 원래 png 파일이었지만, format='JPEG'
를 지정해 주어서 jpg 파일로 변환된 것을 알 수 있다.