본문 바로가기
Backend/Django

장고 CRUD

by 이은선 2023. 3. 5.
728x90
SMALL

이번 시간에는 저번 시간에 만들었던 Blog 모델을 본격적으로 CRUD 해보는 시간을 가질 것이다. 

밑의 링크에서 장고 Blog 모델을 만들고, 장고 shell을 이용해 간단한 CRUD를 해보는 시간을 가졌었다. 

https://esssun.tistory.com/27

 

장고 model

admin 우리가 만들어준 table을 쉽게 확인할 수 있는 사이트가 바로 admin 사이트이다. superuser 생성 python manage.py createsuperuser * Admin 사이트에 들어가려면 Admin 유저를 만들어주어야 Admin 사이트에 접근

esssun.tistory.com

 

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 등의 응답코드에 대한 설명은 다음 블로그 글을 참고하기 바랍니다.

https://esssun.tistory.com/29

 

HTTP 응답코드 종류

*다음은 인프런 김영한의 HTTP 웹_기본지식 강의자료를 토대로 작성한 글입니다. 4xx - 클라이언트 오류 ▪︎ 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음 ▪︎ 오류의

esssun.tistory.com

 

+) 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 에 있는 클래스로 메소드를 만들어서 이를 사용할 수 있다.

 

 

728x90
LIST

'Backend > Django' 카테고리의 다른 글

장고 model  (0) 2023.03.05
장고 기본  (0) 2023.03.04
장고 기본 세팅(Mac)  (0) 2023.03.04