수학과의 좌충우돌 프로그래밍

[Django] 07. 글쓰는 기능 구현하기 본문

웹프로그래밍/Django

[Django] 07. 글쓰는 기능 구현하기

ssung.k 2019. 2. 25. 02:41

안녕하세요 강민성입니다.


저번 시간까지 배웠던 내용을 기초로 하여 blog의 기능들을 만들어보도록 하겠습니다.


지난 시간 배웠던 내용을 확인하려면 여기를 클릭하세요.


다만, 이 부분에서 다루는 내용은 html 이나 css 가 아니므로


bootstrap을 사용하도록 하겠습니다.


bootstrap을 통해 원하시는 대로 꾸미면 되겠습니다.


제 결과물은 다음과 같습니다.



본격적으로 오늘 배울 내용에 대해서 알아보겠습니다.


현재 블로그의 글들은 제가 admin 페이지가 들어가서 만든 글들입니다.


그렇게 때문에 blog 관리자인 저는 글을 쓸 수 있지만,


이용자들을 아직 글을 쓸 수 없습니다.


그래서 이 기능을 추가해보도록 하겠습니다.


이용자도 글을 작성할 수 있도록 해보자



사용자가 게시물의 정보를 기입하는 html이 필요할 것입니다.


이를 new.html 이라는 이름으로 만들어주겠습니다.


템플릿 상속에 대해 잘 모르신다면 여기를 클릭하세요.



물론 이 new를 띄우기 위해서는


views 에 함수를 만들어주고


urls 에 연결해주고


nav bar에 new로 들어가는 링크를 연결해주어야 합니다.


이 과정들은 지금 껏 많이 반복했으므로 생략하도록 하겠습니다.



위 new.html 에서 form 태그 중 action이 하는 역할은 내용을 전부 입력 후,


제출을 하였을 때 어떤 url로 연결해줄지를 결정합니다.


create 라는 url로 연결해보도록 하겠습니다.



 

이제 new.html 에 있는 제출하기 버튼을 누르면


blog/create/  에 해당되는 url로 넘어가면서 views 에 있는 create 함수가 실행이 됩니다.


이제 이 정보를 db에 저장하는 create 함수를 작성해보도록 하겠습니다.


Blog 라는 클래스에서 blog 라는 객체를 생성해줍니다.


그 후 input 태그의 이름에 맞춰서 GET 메소드로 각각의 정보를 저장합니다.


pub_date 는 timezone을 import 하여 현재 시간을 자동으로 넣어주게 됩니다.


그 후 save를 통해 db에 저장하도록 하면 새로운 글이 써지게 됩니다.



글을 저장한 후에는 어느 화면으로 이동하면 좋을까요?


개발자가 정하기 나름이지만, 새로 쓴 글의 상세 페이지로 이동하게 끔 하겠습니다.


이 때 return 으로 redirect를 사용합니다.


사용하기 위해서는 위에서 import 해주고, 우리가 이동하고 싶은 url을 적으면 됩니다.


이 때 주의할 점은 url 은 항상 str이어야 하기 때문에 기존의 int 형이었던 blog.id를 형변환 해주었습니다.





render와 redirect의 차이


이번에 처음 나온 redirect 이지만 기존에 사용하던 render 와 쓰임이 유사합니다.


둘의 차이를 알아볼까요?


render는 html에 파이썬에서 다룬 변수를 넘겨줄 수 있다.


redirect는 그냥 프로젝트 밖의 외부 url을 입력할 수 있다.



이 두 특징의 두 함수의 가장 큰 차이라고 생각됩니다.


그렇다면 왜 redirect는 다른 변수를 넘기는게 안될까요?


이를 이해하기 위해서는 http 의 response를 알아야 합니다.


http 상태코드 


위의 링크와 같이 여러 종류의 응답이 있습니다.


이 때 render가 반환하는 HttpResponse는 http 코드가 200이고 


redirect가 반환하는 HttpResponseRedirect는 HTTP 코드가 302가 됩니다.


300번 대의 경우에는 redirect될 주소만 오기 때문에 다른 인자를 넘겨줄 수가 없습니다.




마무리



글을 쓰면서 render와 redirect의 차이를 많이 찾아보고 고민해보는데


아직도 혼란스럽습니다.


다루지는 않았지만 reverse라는 비슷한 기능을 하는 함수도 있어


혼란을 증폭시킵니다.


추가적으로 알게 될 때마다 글도 다듬도록 하겠습니다.


Comments