django 8. Media 파일

dev-somi·2022년 1월 19일
0

django

목록 보기
7/13

1. Static과 Media 파일

  • Static 파일
    개발 리소스로서의 정적인 파일 (js, css, image)
  • Media 파일
    FileField/ImageField를 통해 저장한 모든 파일
    DB 필드에는 저장경로를 저장하고 파일은 파일 스토리지에 저장

2. ImageField 만들기

class Post(models.Model):
message = models.TextField()
photo = models.ImageField(blank=True)
is_public = models.BooleanField(default=False, verbose_name='공개여부')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

models.py에 ImageField를 만든다.
makemigrations, migrate 명령을 내리면 DB에 반영이 된다.

admin에 들어가면 이렇게 포토 필드가 생겼다.

3. Media 파일 처리 순서

  1. HttpRequest.FILES를 통해 파일 전달
    FILES라는 속성을 통해서 전달된다.
  2. 뷰 로직이나 폼 로직을 통해 유효성 검증을 수행한다.
  3. FileField/ImageField 필드에 경로를 저장한다.
  4. settings.MEDIA_ROOT 경로에 파일을 저장한다.

미디어 파일이 저장되는 경로를 아래와 같이 설정한다.

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

settings.py에 있는 BASE_DIR 값을 더 자세히 살펴보면
아래 코드로 구성이 된다.
즉 해당 settings.py가 있는 부모 부모의 폴더, 즉 프로젝트의 폴더의 경로라는 의미인 거 같다

BASE_DIR = Path(file).resolve().parent.parent

어쨌든 상위 폴더에서 media라는 경로에 미디어 파일을 저장한다는 소리인 것 같음.

media_url에 따라서 업로드한 이미지 파일 링크를 열어보면
http://127.0.0.1:8000/media/그림4.png <- 이러한 주소가 뜬다.

만약에 이미지 url로 접속했을 때 이미지를 반환받고 싶다면

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

위의 코드를 별도로 설정해줘야 한다.
(설정 해주지 않으면 이미지 링크에 접속했을 때 error 발생)

만약 등록한 post를 display를 하고 싶다면,

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['id', 'photo_tag', 'message', 'created_at', 'is_public', 'updated_at', 'message_length']
list_display_links = ['message']
list_filter = ['created_at']
search_fields = ['message']
def photo_tag(self, post):
if post.photo:
return mark_safe(f'')
return None

위 처럼 코드를 작성해주면 된다.
즉 photo_tag 라는 함수를 만들었는데
이 함수의 의미는
만약 post에 photo가 있다면
아래와 같은 img를 반환하라는 의미
앞의 mark_safe는 보안 기능의 일종..이라고 한다.

그러면 위처럼 포토태그 밑에 이미지가 뜬다.

4. FileField와 ImageField

  • FileField
    File Storage API를 통해 파일 저장
  • ImageField
    Pillow를 통해 이미지 픽셀 크기 획득
  • 사용할 만한 필드 옵션
    1) blank 옵션: 디폴트 False
    빈 경로를 허용할 것인지?
    2) upload_to 옵션
    디렉토리 설정
    만약 지정하지 않으면 MEDIA_URL의 경로로 쌓임.
    그러면 해당 디렉토리에 많은 파일이 쌓여서 실제 파일 시스템 상에서 node가 너무 많아짐 -> 시간이 오래 걸린다.

0개의 댓글