본문 바로가기
IT

[프로그래밍] 장고(Django) 파일 업로드

by 밤고래 2021. 8. 8.
반응형

안녕하세요. 밤고래에요 :)

요즘은 파이썬/장고를 통해서 웹 프로그래밍을 하고 있습니다.

 

점프 투 장고를 통해 학습을 하면서 제가 원하는 기능을 구현해나가고 있습니다.

책의 예제를 따라하면서 웹 사이트의 기본적인 틀은 갖추었지만, 

게시판에서 파일을 첨부하는 기능을 구현하는 부분이 없더군요...

그래서 오늘은 파일 업로드하는 부분을 정리해보겠습니다.

 

 

Do it! 점프 투 장고 - YES24

파이썬 입문자도 2주 만에 만들어 운영할 수 있는 게시판 서비스!게시판 만들기로 웹 개발 전 과정 완벽 입문! 파이썬 입문서로 많은 독자에게 사랑받는 『Do it! 점프 투 파이썬』 저자 박응용 선

www.yes24.com

 

 

1. 파이썬/장고의 기본적인 구조

파이썬/장고 웹 어플리케이션의 기본적인 동작 구조를 이해해야 진행이 가능했다.

처음에는 위의 점프투 장고를 따라하면서 이해하기에도 바빴으나, 

그때그때 하나하나의 라인을 이해한것이지 전체적인 흐름을 이해하지는 못했었다.

 

이번에 다시 공부를 하면서 동작의 흐름을 이해하였고, 아래와 같이 정리했다.

 

실제 사용자 흐름은 위와 달리 URL 부터 시작한다. 

위 이미지는 사용자 흐름도라기보다는

소스 단위의 개념 구조라고 이해하는게 쉬울 듯 하다.

 

2. 파일업로드

그럼 위의 예시를 기반으로 실제 소스코드를 보면서 예시를 들면서 파일업로드를 어떻게 구현하는지 알아보겠다.

나는 흐름이 헷갈려서 아래와 같이 파일 Tabs 를 흐름도대로 오픈해서 코딩을했다.

 

 

1) Models.py

Question 이라는 Models(DB) 를 정의하고, 첨부파일을 받을 속성을 정의한다.

이번 예시에서는 imgfile 이라는 속성이 첨부파일을 받을 모델 속성이다.

해당 속성을 사용하기 위해서는 pip3 install image 를 실행하여 image 패키지를 다운로드 받아야한다.

upload_to 는 저장될경로로 ""는 media 폴더를 의미한다.

 

 

 

2) forms.py

form 은 fomrs.Form 을 상속받으면 폼, forms.ModelForm을 상속받으면 모델 폼이라 부른다.
여기서는 form.ModelForm 을 상속받았다.

모델 폼은 말 그대로 모델(DB)과 연결된 폼이며, 모델폼 객체를 저장하면 연결된 모델의 데이터를 저장
즉 별도로 Template 에서 DB에 접근하지 않아도 된다.
Model(DB) - ModelForm - Template(.html) 와 같이 ModelForm 이 html 과 DB 를 연결

여기서 Question 모델을 받을 객체 model 을 선언하고 각 속성과 매칭되는 fileds 를 생성한다.

 

 

3) views.py

맨처음에는 else 문이 먼저 실행된다.

(처음에는 form 입력값이 없는상태에서 호출하기때문에 POST방식이 아니라는 개념)

최상단에서 QuestionForm을 Import한 상태에서 해당 폼을 form 이라는 객체로 저장후

form 을 context 변수에 넣어 템플릿으로 전송한다. (question_form.html)

 

여기서 중요한 것은 question_form.html 에서 입력을 다 한후 submit 을 하면

템플릿에서 form 정보를 다시 view.py 로 보내면서 다시 question_create 가 실행된다.

그러나 이때는 submit 을 했으므로 request.method가 POST 가 되면서 

if request.method == 'POST': #저장하기, 입력후 실행부 아래 구문들이 실행된다.

 

파일업로드 기능을 구현하면서 가장 해맨부분을 130번 라인이다.

템플릿에서 form 정보를 보냈을 때 form 객체를 다 받아서 한번에 저장(quesiton.save())하면안된다. 

file 형태를 저장하기위해서는 따로 form의 file 속성을 지정하여 request 값과 매핑시켜줘야한다.

 

4) question_form.html

템플릿이라고 불리우는 이 부분은 사실 익숙한 html 소스이다.

views.py 에서 보낸 form 정보를 이 템플릿에서 html 로 보여주며, 

이 페이지에서 입력한 form 값을 다시 views.py 로 보낸다.

 

파일 업로드와 관련된 부분은 line 33~36 이며, type을 file 로 하여 input 태그를 사용한다.

 

 

실제 화면에서 보여지는 부분은 아래와 같다.

 

감사합니다 :)

 

반응형

댓글