파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.
# settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media' # 구버전은 os.path.join(BASE_DIR, 'media')
pip install pillow
upload_to
인자 유형# models.py
from django.db import models
class Post(models.Model):
message = models.TextField()
is_publish = models.BooleanField(default=False)
# FileField 또는 ImageField를 사용해서 저장할 수 있다.
# upload_to에는 문자열 또는 함수의 지정이 가능하다.
photo = models.ImageField(blank=True, upload_to=uuid_name_upload_to)
# uuid_name_upload_to 함수를 지정하였다. 이 함수는 다음 예제에서 정의한다.
# 또는 'post/%Y/%m/%d'와 같이 문자열 지정이 가능하다.
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.message
모델의 ImageField 또는 FileField의 upload_to 속성에 지정할 함수
# utils.py
import os
from uuid import uuid4
from django.utils import timezone
def uuid_name_upload_to(instance, filename):
app_lebel = instance.__class__._meta.app_label # 앱 이름
cls_name = instance.__class__.__name__.lower() # 모델 이름
ymd_path = timezone.now().strftime('%Y/%m/%d') # 업로드하는 연/월/일
uuid_name = uuid4().hex # 랜덤 문자열
extension = os.path.splitext(filename)[-1].lower() # 소문자 형식의 확장자 추출
return '/'.join([
app_label,
cls_name,
ymd_path,
uuid_name[:2],
uuid_name + extension,
])
# urls.py
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)