Media 파일 다루기


💡 Media File

FileField/ImageField를 통해 저장된 모든 파일

DB필드에는 저장경로를 저장하며, 파일은 파일 스토리지에 저장

실제로 문자열을 저장하는 필드



💡 Media File 처리순서

  1. HttpRequest.FILES를 통해 파일이 전달
  2. 뷰 로직이나 폼 로직을 통해, 유효성 검증을 수행한다.
  3. FileField/ImageField 필드에 “경로(문자열)”를 저정한다.
    • 실제 DB에 저장되는 경로
  4. settings.MEDIA_ROOT 경로에 파일을 저장한다.


💡 Media File settings

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

여기서 MEDIA_URL는 각 파일에 대한 URL경로를 저장한다.

필드명.url 속성에 의해서 참조되는 설정이며, 파일 접근시 사용된다.

MEDIA_URL의 경우에는 실제 파일을 저장하는 ROOT 경로이다.


추가적으로 파일을 업로드 할 때 HTML에 설정해줘야 할 것이 있다.

form 메소드는 POST로 지정하고, form enctype은 꼭 “multipart/form-data”로 지정한다.

get 요청의 경우에는 “application/x-www-form-urlencoded”로 고정된다.



💡 개발 환경에서 media 파일 서빙

static파일과 다르게, 장고 개발서버에서 서빙을 지원해주지 않는다.

따라서 개발 편의성의 목적으로 직접 서빙 Rule을 추가해줘야 한다.

from django.conf import settings
from django.conf.urls.static import static

# 중략

if DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                        document_root=settings.MEDIA_ROOT)

그리고 장고에서는 정적파일 서빙을 배포단계에서 하는 것을 권장하지 않는다.

따라서 DEBUG를 True로 설정해준다.



💡 이미지 파일을 나타낼 때

#-- admin.py
from django.utils.safestring import mark_safe

#생략

def photo_tag(self, post):
    if post.photo:
        return mark_safe(f'<img src="{post.photo.url}" style="width: 72px;" />')
    return None

mark_safe를 사용하면 이미지가 표현이 된다.



💡 유용한 필드 옵션

#-- models.py

class Post(models.Model):
    photo = models.ImageField(blank=True, upload_to='post/img/%Y/%m/%d')

blank=True 옵션은 이미지가 없어도 괜찮다는 뜻이다.

upload_to 옵션은 settings.MEDIA_ROOT 하위에서 저장한 파일명/경로명을 결정한다.

디폴트 값은 파일명 그대로 settings.MEDIA_ROOT에 저장한다.

동일 파일명으로 저장 시에, 파일명에 더미 문자열(날짜 등)을 붙혀 저장한다.