Media 파일 다루기
💡 Media File
FileField/ImageField를 통해 저장된 모든 파일
DB필드에는 저장경로를 저장하며, 파일은 파일 스토리지에 저장
실제로 문자열을 저장하는 필드
💡 Media File 처리순서
- HttpRequest.FILES를 통해 파일이 전달
- 뷰 로직이나 폼 로직을 통해, 유효성 검증을 수행한다.
- FileField/ImageField 필드에 “경로(문자열)”를 저정한다.
- 실제 DB에 저장되는 경로
- 실제 DB에 저장되는 경로
- 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에 저장한다.
동일 파일명으로 저장 시에, 파일명에 더미 문자열(날짜 등)을 붙혀 저장한다.