이번 시간에는 저번 시간에 만들었던 Blog 모델을 본격적으로 CRUD 해보는 시간을 가질 것이다.
밑의 링크에서 장고 Blog 모델을 만들고, 장고 shell을 이용해 간단한 CRUD를 해보는 시간을 가졌었다.
Blog를 렌더링해줄 페이지 생성
<project-urls.py>
<blog-views.py>
<blog-templates-home.html>
- 이번에는 blog 앱 안에 templates 폴더를 만들고 그 안에 html 파일을 만들어주었다.
- 이렇게 되면 project의 settings.py에서 별도의 조작 없이도 앱 안의 templates 폴더를 자동으로 인식할 수 있게 된다.
-> urls.py의 두번째 인자인 views.py의 home 함수가 호출이 된다. 그 후, 요청에 따라서 장고가 database에 요청을 보내면 models.py에 있는 Blog 테이블 전부를 가져와서 blogs(views.py-home 함수에 작성)라는 queryset을 만들고 이를 html로 같이 쏴주게 된다. 결과적으로, html에서 쏴준 데이터를 이용해 뷰를 구성하게 된다.
장고 shell 이용하여 객체 생성해보기 - CRUD
- 첫번째로는, 파이썬의 class 객체 생성하는 방식으로, 인자에 field 값을 채워주고 Blog 객체를 생성해주었다.
- 그 뒤엔 save()를 통해 생성한 객체를 저장해주었다.
- 두번째로는, create()를 이용해 객체를 생성해주었다.
- 그 후, 모든 객체를 출력해보았더니 우리가 위에서 만든 2개의 객체가 잘 들어가있는 것을 확인할 수 있다. 이 2개의 객체는 title과 content field 값이 모두 같지만, pk 값이 다르므로 이들을 구별할 수 있게 된다.
runserver을 해서 확인해본 결과, 우리가 home.html에 작성해준대로 blog의 제목과 내용, 생성 시간이 잘 뜨는 것을 볼 수 있다.
Blog Detail Page 만들기
▪︎ 우리가 구성하려는 orm
- 우리는 PATH-CONVERT를 이용해 1번 Blog글만 보겠다고 요청을 한다.
- 요청한 것을 가지고 views.py가 함수를 실핸한다.
- 요청에 맞는 데이터를 데이터베이스에 요청한다.(models.py)
- DB에서 받은 object와 같이 응답한다.(views.py)
▪︎ 작성 코드
<blog-views.py>
- 인자로 id를 추가해주었다.
- 잘못된 서버 요청을 받았을 때에도, 서버가 망가지지 않고 적절한 응답(404 Not Found)을 내보내기 위해 get_object_or_404() 사용
- get_object_or_404 첫번째 인자로는 어떤 모델인지, 두번째 인자로는 pk 값을 id를 통해 받아올 것이다.
+) pk(primary key)란?
-> model에서 찍어낸 수많은 객체들을 구분할 수 있는 구분자라고 할 수 있다. 위의 코드에서는 blog_id가 pk값이 됩니다.
+) get_object_or_404란?
-> path-converter로부터 넘겨 받은 blog_id를 받아 Blog객체(model에서 정의된)들 중 pk값이 blog_id인 것이 있으면 가져오고 그렇지 않으면 404 에러를 발생시켜라 라는 의미이다.
따라서 객체를 가져오기도 하고, 에러메세지를 보내는 역할도 합니다.
+) HTTP 응답코드 종류
-> 404 이외의 400, 401, 500 등의 응답코드에 대한 설명은 다음 블로그 글을 참고하기 바랍니다.
+) render 함수란 ?
-> views.py에 어떤 요청이 들어오면 리턴으로 응답을 보내게 되는데, render 함수는 어떤 html을 응답을 해줄지에 대한 처리를 해주는 함수이다. 쉽게 말해, 걸맞는 객체를 요청에 더해 보내주는 역할을 한다.
<project-urls.py>
- Path-converter를 활용하여 int형의 id값을 보내줄 것을 명시해준다.
- int형의 id값을 보내면 blog-views.py에서 이를 받아 id라는 parameter로 쓸 수 있게 된다.
- <>형태가 아닌 get을 통한 querystring을 이용해 id값을 보내주는 방법도 있다.
+) Path-Converter란? (int:id)
-> path에 converter 타입의 변수를 넣어서 view 함수의 파라미터로 받을 수 있게 하는 것이다.
즉, 장고에서 여러 객체들을 다루는 계층적 url이 필요할 경우에 사용하며, <type:name>와 같은 모양입니다. 지정한 converter type의 name변수를 view 함수로 넘기라는 의미이다.
블로그 글들이 생성될 때마다 각 블로그에 해당하는 'blog/1', 'blog/2'와 같은 url과 view들을 만드는 것은 매우 비효율적이며 그렇게 할 수도 없다. 따라서, 하나의 코드로 url과 view를 다루어야 한다.
<int:blog_id>를 path-converter로 하여 detail 함수에 넘겨준다는 의미이다.
+) path 함수란?
-> 장고 urls에서 만들어진 함수로 3개의 인자가 들어간다. 첫번째로는 어디로 요청을 보낼지 요청할 주소를 지정(string), 두번째로는 첫번째 인자의 string으로 요청이 들어가면 무슨 함수를 실행할지 함수 호출 부분, 세번째로는 namespace로 이 path를 다른 html이나 함수에서 사용하고 싶을 때 이 세번째 인자를 활용한다.
<home.html>
- <a href = " "> 태그와 속성은 다른 웹사이트로 링크를 하는 기능이다.
- detail로 넘겨 줄 때, 해당 블로그의 아이디(blog.id)를 함께 넘겨주어야 한다.
- 'detail'은 path의 name(namespace)을 의미한다.
- path converter에선 namespace 다음에 매개변수로 넘겨야할 데이터를 넣어줘야한다. 우리는 detail page에서 블로그의 각 글 하나를 보고 싶은 것이므로 blog의 id 값을 넣어준다.
-> home.html 파일에서 상세 페이지로 넘어가는 링크를 클릭하면 blog의 id 값을 blog의 urls.py로 넘겨준다. 그 후, urls.py의 path converter를 통해 id값을 views.py에 있는 detail 함수의 parameter 보내준다. 그 뒤, get_object_or_404라는 함수에 이 인자값(id)를 넣어 blog라는 데이터를 가져올 수 있게 된다. 마지막으로, 리턴해줄 때 detail.html이 blog를 보내준다.
home.html -> urls.py -> views.py-detail 로 blog의 id를 넘겨 받는다.
<detail.html>
▪︎ 결과 화면
- 하이퍼링크를 클릭 시 blog의 PK(id 값)을 상세 페이지로 넘겨준다. (Path-Converter)
- home을 보여달라고 client가 요청을 보내면 이 요청에 대한 응답을 해줄 수 있는 파일은 views.py이다. views.py에서 blogs(Blog의 모든 객체)를 home.html로 넘겨준다. 여기서 Blog는 데이터베이스인데, Blog의 PK를 별도로 지정하지 않을시 기본적으로 settings.py의 DEFAULT_AUTO_FIELD에서 PK값을 unique하게 생성해준다.
새 글 작성하기 Form 생성
▪︎ 우리가 구성하려는 orm
- new.html은 form만 있는 페이지인데, 장고가 이 페이지를 user에게 응답해준다. 그 뒤엔, new.html 받은 user가 글을 작성한 뒤 POST 요청을 보내면 요청 주소가 이 요청을 받은 후 views.py에서 요청에 대한 함수를 실행한다. 그 뒤, 요청에 맞는 데이터를 가지고 데이터베이스에 insert요청을 보내면 이 값을 저장한 후 views.py에서 redirect를 해주게 된다.(render X)
▪︎ 작성 코드
<project-urls.py>
<new.html>
- POST 방식으로 데이터를 보낼 때, csrf 공격을 막기 위해 csrf 토큰을 발급해준다.
- name은 일단 DB의 field명과 통일해주었다.
- 여기서 create 함수는 new.html에서 입력한 정보들로 views.py에서 데이터베이스에 저장할 수 있도록 해준다.
<blog-views.py>
new
- form tag에 정보들을 저장하고 form으로 action을 통해 create 요청을 보냈을 때 POST request 안에 있는 body는 다음의 정보가 객체 형태로 보내지게 된다. form tag안의 input에 붙여준 이름이 key, 적어준 정보가 value가 돼서 key-value 쌍의 형태.
create
- POST를 요청받은 title, content를 새로 만든 객체에 넣어준다.
= create() 함수에선 저장만 하므로 render를 하지 X, redirect 수행
- redirect의 인자로 쓴 url로 이동할 수 있게 함.
▪︎ 결과 화면
우리는 이를 통해 10번째 객체가 생성되었음을 알 수 있다.
홈 화면(list view)으로 돌아갔을 때에는 우리가 작성한 글이 잘 반영되었음을 확인할 수 있다.
+) 추가
내용이 긴 글 작성시 List view 페이지에서 일정 글자수가 넘어가면 자르고 싶을 때 다음과 같이 작성한다.
<blog-models.py>
- 본문은 TextField이고, 이는 파이썬에서 String인데, String은 배열로 취급할 수 있어서 Slicing 가능하다.
<home.html>
- 기존의 blog.content를 보는 것에서 blog.summary 출력으로 변경해주었다.
- 우리는 이렇게 models.py 에 있는 클래스로 메소드를 만들어서 이를 사용할 수 있다.
'Backend > Django' 카테고리의 다른 글
장고 model (0) | 2023.03.05 |
---|---|
장고 기본 (0) | 2023.03.04 |
장고 기본 세팅(Mac) (0) | 2023.03.04 |