본문 바로가기
django

2020.09.19_django_class CRUD

by 해맑은 코린이 2020. 9. 19.

2020.09.19_django_class CRUD_ 정리노트

 

 

오늘은 맨 처음 기본적으로 했던 view에서 함수로 만들었던 CRUD 기능을 장고에 있는 class로 쓰기! 

 

먼저 함수와 클래스 비교!

 

장고에서 함수와 클래스는 쓰임에 따라 다르지만, 각자 장단점이 있다

 

 

함수형  ( def )

내가 직접 기능 하나하나를 짤 수 있어 원하는 기능을 만드는 능력만 있다면 , 함수를 쓰는 것이 자신의 입맛대로

로직을 짤 수 있다.

하지만 짜다보면 로직이 복잡하고 재사용성이 별로 좋지 못하다.

 

 

클래스형 뷰 ( class ) 

상속과 믹스인 기능을 사용하여, 재사용성이 용이

체계적인 뷰 구성 가능

urls.py 에 .as_view () 메서드와 함께 사용

간편하지만, 내 마음대로 코드 짜기는 안되겟쥬 그래서 오버라이딩이라는 기능이 있는데,

 

 

오버라이딩

부모클래스를 상속받아 자식 클래스에서 이미 제공된 메소드를 특정한 형태로 구현하는 것! 파이썬 개념이라네여.

이거는 밑에서 쓰면서 한번 해보겠음.

 

 

여기서 .as_view() 란?

우리가 함수에서 써줬던 GET,POST 등의 메서드를 dispatch() 라는 메서드의 방법으로 인스턴스를 생성

dispatch() 는 GET, POST 등 HTTP method 를 구분하여 해당 인스턴스 내의 get,post 등의 메서드로 중계 하는 기능! 

.as_view() 를 구현하지 않으면 HttpResponseNotAllowed 예외가 발생한다.

 

엄.. 뭔말인지 자세히는 모르겠으나 ㅎㅁㅎ... 우리가 함수에서 써줬던, if request.method = "POST" 와 비슷한 기능을 하는 것 같음! 

 

또한 .as_view(인자) 를 써줘서 해당 뷰에서 필요한 인자를 여기서 넘겨줄 수도 있음 !-!

 

 


 

이제 우리는 장고에서 자주 쓰이는 기능들을 구현해놓은 것들을 클래스로 상속할건데, 그 기능들을 제너릭 뷰 ( generic view ) 라고 함! 오늘은 CRUD에 쓰이는 view들을 들고와서 클래스로 상속하여 기능을 구현을 해보게씀!

 

 

 

 

 

모델 먼저 작성 ㄱㄱ 여기서 verbose_name은 뭐람.

저렇게 모델에서 옵션을 주게 되면,  admin 관리자 페이지에서 모델 이름을 내가 보기 쉽게 정해줄 수 있다. 원래는 그냥 영어로 뜨던 모델이름이, 저렇게 verbose_name 을 주게 되면, 

 

 

 

이렇게 뜨던 모델의 이름을 class meta를 써주고 verbose_name 을 입력해봅씨다

 

 

 

오잉 근데 그러면 편지라고 써줬는데 왜 s 도 같이 나오지 요 옵션은 영어를 기준으로 단수형을 정하는 기능이기 때문에 그럼. 한글은 따로 단복수를 구별안하지만 우리가 모델 클래스를 영어로 적어줬기 때문에 아까 Letters 처럼 이 모델 클래스는 복수형이라고 인식해서 뒤에다가 s를 붙인것 복수형 옵션은 바로 

 

 

뒤에 plural을 붙이면 복수형을 지정해줄 수 있다. 이렇게 두 가지 옵션으로 단수는 편지라고 뜰 것이고, 복수는 편지들이라고 뜨겠지. 관리자 페이지로 가서 확인하면, 

 

 

이렇게 편지들이라고 잘 뜨게 된다. 이렇게 내가 배웠던 내용들 정리 한 번 더 해봤음. self는 저번 포스팅에서 쓴 것처럼 문자열 반환으로 특정 필드에 이름을 정해주기 느낌이라고 생각하면 됨!  ForeignKey 를 쓰게 될 때 써주는 함수 였음 ~.~


 

 

 

먼저 CRUD 에 관한 view를 장고 공식문서로 가서 보면서 하는게 좋음. 일단 들어가봅씨다

 

출처 - dajngo 공식 문서

 

출처 - django 공식문서

 

출처 - django 공식 문서

 

 

우리가 오늘 쓸 것들은 여기 view들에 들어가 있다. 하나씩 써보게씀.

 

먼저 CreateView 먼저 ㄱㄱ

 

 

공식 문서로 가면 이렇게 정리가 되어 있다. 뷰에서 CreateView 를 상속해주고, 모델이름을 정해주고, 필드에 뭘 넣을 건지 정해주면 된다! 이렇게 하고 html 템플릿 상에서 form으로 띄워주면 되는 것! 모델폼도 안써도 되고 편리하군... 과연 근데 편리할까 ...ㅎ.. 헣허

일단 이렇게 여기서 적어주라는 대로 view로 가서 적어줍씨다.

 

 

 

 

 

뷰에서 이렇게 import 해주고

 

 

 

 

우리가 만들어준 모델을 말해주고, 필드에는 내가 모델에서 적어 준 모든 것들을 받아오기 위해서 '__all__' 이라는 옵션을 모두 들고와 주었다.

 

 

 

 

그러고 또 해주라는 데로 create.html 로 가서 form 을 이렇게 띄워주었다.

 

 

index.html

 

 

이렇게 인덱스로 가서 마지막으로 편지쓰기 링크를 연결해주면...!

 

 

 

 

껄껄...^^ 의도된 오류임. 내가 잘못한거 아님...ㅎ....

보면 앱안에 letter_form 이라는 템플릿 파일이 없단다. 여기서 클래스형의 단점... 이미 다 만들어져 있는 거기 때문에, 

거기에 맞춰서 적어줘야 한다는거 .. 하지만 우리는 아까 말했던 오버라이딩이라는 걸 써서 굴복하지 않고 내 맘대로 템플릿 이름을 정해주자.

 

 

 

 

이렇게 template_name 을 써서 우리가 원하는대로 이름을 바꿔줄 수 있다. 우리에게 익숙한 create.html 로 만들어주자. 

 

 

 

마지막으로 순서가 조금 바꼈지만 껄껄  url 요청을 연결 시켜줍씨다.

 

불러와주기

 

 

 

이제 아까 위에서 설명했던 클래스형 뷰를 LetterCreateView도 .as_view() 메소드로 연결 시켜줍씨다.

 

 

그러면 create/ 경로로 들어가게 되면,

 

 

 

 

짝짝 우리가 아까 create.html 에 띄워줬던 폼이 잘 뜨는군 근데 생각해보니 우리가 작성해준 폼들은 지금 어디로 넘어가는걸까.. 어떻게 처리가 되는거지.. 일단 한번 작성을 해보면

 

 

 

 

역시나..넘어가지를 못하는군.. 여기서 보면 redirect 할 url이 없다고 하네.. 모델에서 get_absolute_url 을 쓰거나 따로 redirect 할 url 넘겨주래 !! 그러면 이렇게 써줄 수가 있지.

 

 

 

이렇게 써줄 수가 있는데 reverse_lazy 는 여기서 우리가 쓰던 redirect 와 같은 기능이다. 

우리가 주로 url을 호출하는 방법이 여러가지가 있는데,

제너릭뷰에서는 reserve 라는 방법 대신 타이밍 로딩문제로 reverse_lazy 를 쓴다는 정도만..? 알고 넘어가면 좋을듯!

 

 

 

물론 여기서 기능 불러와 주어야 함.

 

 

 

 

 

쨋든 우리가 이제 메인 페이지인 index로 보내주고

인덱스에서 이 폼들을 받아서 리스트형태로 띄워주는 ListView 를 만들어보자.

 

 

 

 

요롷게 공식문서에서 정의해주면 된다고 있는데, 

 

 

 

 

 

또 템플릿이 없다는 오류를 띄워줄 것이 분명하다.. 미리 템플릿 이름도 오버라이딩 해서 바꿔준다.

 

 

 

이거는 내가 저번에 썼던 CRUD 함수형 잠시 들고옴

 

 

또한 우리가 뷰에서 작성해준 글들을 하나씩 띄워주려고 변수에다가 모델 오브젝트들을 담아서 딕셔너리 형태인 context로 가져왔잖??

 

 

이거를 클래스형 뷰에서는 어떻게 들고와줄 수 있냐면 

 

 

 

 

 

이렇게 context_object_name 으로 들고오면 된다. 짝짝 그러면 이렇게 변수를 생성해주고,

 

 

 

인덱스로 간다.

 

 

index.html

 

우리가 써줬던 변수명인 letters를 for문으로 글 하나하나 써주고 구분을 hr 태그를 사용해서 해주었다! 요소하나하나는 대충 br 태그로 줄바꿈해서 적어주어씀

 

 

 

 

urls.py

 

 

이제 또 url에다가 .as_view() 형태로 써줌써줌. 인덱스에는 우리가 만들어준거 리스트로 띄울테니까 이렇게 적어주었다!!

 

 

자 이제 진짜 실행 해봅씨다

 

 

 

 

 

 

요기에 이런게 생길거고,

 

우리가 작성해준대로 모델 잘 뜰거고 편지작성하면?

 

 

 

이렇게 ListView 를 써서 아이디부터 제목, 적는사람, 내용까지 알아서 잘 index 에 띄워주는 것을 볼 수 있다.

 

 

 

후 이제 deatil ,update, delete 남아따...! 일단 디테일 해주기로 ㄱㄱ

 

 

 

 

 

DeatailView 는 이렇게 써준다. 모델을 말해주고, 템플릿이름도 우리가 자주 쓰던 detatil.html 로 바꿔주었다.

또 템플릿에서 띄워줄 변수를 가져와 주기 위해서 context를 여기다가 써주었다.

 

 

이제 index.html 으로 먼저 가서 디테일 페이지로 들어가게 연결 먼저해줍씨다.

 

index.html

 

 

이렇게 for문 안에다가 전체적으로 누르면 detail 페이지로 들어가게 링크를 걸고, 우리는 특정 글의 디테일을 보여줘야 하므로 id 값을 같이 가지고 와줘서 url의 pk 값이 자동으로 letter.id 라는 값으로 불러오게 해주었음!

 

자 그럼 url로 가서 pk 값과 함께 연결 시켜주게씀.

 

 

 

 

이렇게 연결 시켜주면 letter.id 가 pk 값으로 자동으로 담긴다. 

 

 

이제 연결 시켜주었으니 템플릿 상에서 띄워주자.

 

 

 

이렇게 아까 뷰에서 적은 변수들을 이용해서 제목과 내용들을 불러와주고 실행시켜준다면?

 

 

 

 

url 상에서 pk 값을 들고와서 같이 띄워주고,

 

 

 

 

템플릿상에서도 연결이 잘 되어 제목과 내용을 띄워준다. 후 이제 업데이트로 간다.

 

 

 

 

UpdateView 도 이렇게 써주고, 보면 모델 등록, 필드에 뭘 넣어줄건지, 템플릿 이름도 바꿔주고, 우리가 가져올 pk 값을 적어주고 ( 이거는 형식상 생략해도 템플릿 상에서만 잘 띄워주면 되긴 하더라! 그래도 나는 확실히 하기 위해 적어줬음. ) 마찬가지로 성공하면, index로 url 을 보내준다. 

 

 

urls.py

 

 

또 urls.py 로 가서 pk 와 함께 연결을 마찬가지로 해주고, 위에도 임포트해준다.

 

 

detail.html

 

마찬가지로 detail 로 들어갔을 때 update 를 수행해주어야 하기 때문에, 여기다가 pk 값을 불러올 수 있게 이렇게 써주고,

 

 

 

 

update.html 을 생성해서 업데이트 폼을 띄워주자. 

 

후 실행 ㄱㄱ

 

 

 

detail 페이지로 들어가면 수정 페이지가 잘 뜨고, 

 

 

 

 

pk 값과 기존 내용을 잘 담아서 띄워주는 것을 볼 수 있다. 

 

 

흐어 마지막 delete 로 가자

 

 

 

 

 

자 이렇게 쓰라네여 그러면 써주자.

 

 

 

 

 

 

 

 

이번에는 이렇게만 써주고, 템플릿 이름 그대로 쓰면 되는지 보게씀.

 

 

 

 

이렇게 수정과 똑같이 써주고, 이 요청을 받을 url로 간다.

 

 

 

 

 

최종 url.... 휴 ㅠㅠㅠ  이렇게 똑같이 delete 도 pk 값을 들고 와서 해주고, 실행해주면!!!!!!!

 

 

 

 

역시 떴다 오류 템플릿 이름 그대로 해주겠음 후..

 

 

 

 

ㄷㄱㄷㄱ 될까

 

 

 

 

 

된다!!!!!!!!!! 근데 이제 폼에서 한번 확인하고 진짜 지울 건지 물어본다. 이거 안물어보고 바로 지우게 하는 방법도 있지.

 

 

 

 

자 이것의 뜻은 우리가 페이지를 따로 안넘겨주고 요청을 받아주는 건데, 우리가 기본적으로 detailview 에서는 POST 에 대한 요청이 오면 삭제하는 기능을 가지고 있는데, 우리가 a 태그로 delete 요청을 보냈을때는 get으로 요청이 들어간다. 그래서 우리는 get 으로 들어온 요청 자체 (self)를 post 로 리턴해줘서 deleteview 의 삭제 요청을 바로 실행시키도록 한 것이다. 쨋든 이렇게 요청을 받아와 주게 되면,

 

 

 

 

삭제를 누르게 되면, 

 

 

바로 post로 리턴해준 값을 deleteview에서 실행 시켜서 삭제시키고  reverse_lazy 에 의해 index로 돌아가게 된다!!

 

 

 


 

 

짝짝 드디어..........모든 기능 끝 후 엄청 길어졌지만, 쨋든 오늘은 함수형 뷰가 아닌 클래스형 뷰로 CRUD 를 모두 구현해보았다! 이렇듯 코드자체는 간단해지지만, 얘가 해주라는대로 맞추거나 오버라이딩을 해야하니 각각의 장점이 있겠지 짝짝 포스팅 끝끝!!!!!!!

댓글