장고 이미지 올리기

Pywiki
둘러보기로 가기 검색하러 가기

1 개요[편집 | 원본 편집]

장고에서 이미지를 다루는 것과 관련한 문서.

사진을 올리고 관리하기 위해선 모델을 하나 만들어 개별적인 관리가 필요하다.

이미지 사용은 두가지 개념이 있다. 관리자가 static 디렉터리 안에 두고 사용하는 이미지와 사용자들이 올리는 이미지.(media)

1.1 사전 준비[편집 | 원본 편집]

1.1.1 pillow 설치[편집 | 원본 편집]

pip install pillow : 이미지를 관리해주는 라이브러리.

모델을 반영하기 위해 makemigrations를 실행하면 에러가 뜬다. HINT로 pillow를 설치하라는 메시지가 뜬다. 메시지 그대로 python -m pip install Pillow를 입력하자.

1.1.2 업로드 폴더 설정[편집 | 원본 편집]

settings.py에 MEDIA_ROOT를 다음과 같이 설정한다.(기본설정이 없기 때문에 새로 써주어야 한다.)

MEDIA_URL='/media/' #미디어 파일을 불러올 때 사용할 가상 url을 설정한다.

MEDIA_ROOT=BASE_DIR / 'media' #기본프로젝트 하위의 media에서 모든 업로드 매체를 관리한다.
#media 하위에 앱이름으로 디렉터리를 만들고 파일을 업로드하게 된다.

유저가 업로드한 파일이 모두 여기에서 관리된다.

2 방법[편집 | 원본 편집]

과정 설명 방법
모델 생성 이미지를 저장할 모델과 칼럼을 생성해준다.

 /앱/models.py 안에 작성한다.


upload_to는 저장할 경로를 정하는 것. 경로는 연도, 월, 일자로 구분하는데, 하나의 디렉터리에 관리하는 것보다 찾는 속도가 빠르다. 그리고 파일의 내용에 대해 유추하기도 어렵다.

저장경로는 f'경로/%Y/{변수}' 형태로 지정해 넣을 수도 있다.

default는 이미지 업로드가 되어있지 않을 때 사용할 것을 의미한다.

default 는 해당 미디어를 찾지 못했을 때 나타내 보여줄 것.

class 모델명(models.Model):
    ...
    upload_to='images/%Y/%m/%d', default='images/no_image.png'
    ...
이미지 올리기 HTML의 폼을 이용해 올린다.

미디어를 올릴 땐 enctype를 명시해주어야 한다.

<form action="{% url '앱:경로' %} " method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="뷰에서받을변수명">
    <input type="submit" value="등록하기">
</form>
뷰에서 받기 다음과 같은 방식으로 html로부터 받아 다룰 수 있다.
def upload_image(request):
    if request.method == "POST":
        img = request.FILES["뷰에서받을변수명"]
 
        # 정보를 파일에 저장하기(선택사항)
        img_model = models.테이블(컬럼 = img)
        img_model.save()