{TIL} 200917 Django - CBV

pyhoo·2020년 9월 18일
1

TIL

목록 보기
6/6
post-thumbnail

지금까진 장고의 함수형 뷰만 사용했는데, 오늘은 클래스형 뷰를 배웠다.

함수형 뷰는

  • 변수명을 변경하는 등 커스텀은 자유롭고, 읽기 쉬우며 코드의 흐름이 명료하다.

클래스형 뷰는

  • 상속(inheritance..맞나?)을 통해 코드를 간단하게 작성할 수 있는 이점이 있다. 하지만 이는 곧 단점이 되기도 하는데, 부모객체에서 받아오기 때문에, 부모 객체를 쉽게 수정할 수 없다는 점이다.
    부모의 속성을 조금 다르게 상속받고 싶을 땐, '오버라이딩'을 해준다.

  • 쉽게 생각해 오버라이딩은 덧씌우기인데, 부모 속성의 a를 자식 객체에서 바꿔주는 것이다.

    ex 부모 클래스: a = '에이'
    -> 자식 클래스(부모 클래스 상속 후): a = 'a'

  • 클래스형 뷰를 사용하는 이유는 후에 DRF를 배울 때 더 적합하기 때문이라고 한다.

  • QuerySet : 데이터를 뜻한다.

✨ 실습 시작

  1. 우선 models.py에서 Letter 클래스를 만들어준다. 편지를 보낼 때 필요한 제목과 보낸 이, 편지 내용을 변수로 선언한다.
class Letter(models.Model): # class는 모델을 만들 때 쓴다.

    title = models.CharField('제목', max_length=100)
    sender = models.CharField('보낸 이', max_length=100)
    content = models.TextField('편지 내용')
    
    class Meta: # 클래스 내부의 속성을 정해줄 수 있다.
        verbose_name = '편지'
    
    # 이 함수의 이름 마저도 약속이 돼있는 것
    # 클래스 내부에 약속 돼있다.
    def __str__(self):
        return self.title

# makemigrations => migrate : db에 등록한다 모델을. 
  • class Meta는 클래스 내부의 속성을 정의해주는데, 이것을 해주지 않으면, admin페이지에서 장고에서 임의로 지정한 이름이 나오게 된다.
  1. views.py로 넘어와서
    기존에는 def index(request) 함수를 통해 render를 했다면, 지금부터는 정해진 클래스 속성을 상속받아 페이지를 보여주도록 한다.
    장고 공식문서에 쓰인대로 상속받을 클래스를 import해준다.

우선 싹다 가져오자

🎉 LetterListView

ListView는 보여주고자 하는 모델을 리스트로 쪼로록 보여주는 속성이다.
class LetterListView라는 클래스를 선언해서 보여주겠다.

  • 굉장히 인상깊었던 것은, Letter model에 저장된 글을 가져오려면 model = Letter 한 줄만 있으면 되는 것이었다.
  • ListView를 상속받는 순간부터 어떤 html파일을 render할 것인지 다 정해져 있기 때문에 가능한 일이다. 물론 이미 정해진 규격(?)대로 사용하면 헷갈릴 수 있기 때문에 우리는 '오버라이딩'을 통해 template_html파일 이름을 우리가 원한대로 바꿔주자.
  • context_object_name 을 통해, html파일 내부에서 변수를 어떻게 선언할 것인지도 정해주자.
  1. url설정도 잊지 말자 (미리 다 설정해뒀다)
  1. 필요한 클래스를 우선 다 만들어보았다.

🎉 LetterDetailView <= DetailVeiw로 부터 상속받음

  • LetterDetailView는 모델의 내용을 디테일페이지에서 다시 보여주는 기능밖에 없으므로, LetterListView와 크게 다를게 없다.

🎉 LetterCreateView <= CreateView로 부터 상속받음

  • LetterCreateView는 CRUD에서 C(reate)에 해당하는데,Letter 모델에 들어갈 내용을 직접 입력하는 페이지를 만드는 것이다.
    중요한 점은 fields 변수를 선언해, Letter model에 필요한, title, sender, content를 입력해준다.
fields = ['title','sender','content']
모든 필드를 다 쓰고 싶다면 간단히
fields = '__all__'

🔽 create.html

1) 자 일단 form태그를 선언하자. 그래야 submit button을 누르면 이 form이 전송되기 때문이다.
2) 어디로 전송되느냐, index page로 넘어간다!
3) 왜 index page로 넘어가느냐, 바로바로 class LetterCreateView에서 success_url을 index로 지정했기 때문이다!
4) index.html이 아닌 index로 지정한 이유는 urls.py에서 path(blahblah, name ='index')로 이미 지정해놨기 때문이다!
5) 그럼 form 태그 내부에 뭔가를 입력해야하지 않겠는가, 기본적으로 input 태그를 사용하여 내용을 입력할 수 있지만, 간단하게 {{form}}을 사용하면 model의 fields를 그대로 입력할 수 있게 된다.
6) 왜냐?! 바로 LetterCreateView가 CreateView(from 공식문서)를 상속받았기 때문에 {{form}}만 쓰더라도 Letter model의 필드값을 받아올 수 있는 것이다.
7) 장황했던 CreateView 구구절절 끝-

🎉 LetterDeleteView <= DeleteView로 부터 상속 받음

  • LetterDeleteView는 CRUD의 D(elete)에 속하며, 모델을 지우는 역할을 한다.
  • 우선 delete()가 성공적으로 수행된 후 보여줄 페이지를 success_url로 설정해준다.
  • 그 다음, def get()메서드를 설정해주는데, 삭제버튼을 누르는 것 자체가 GET방식이기 때문이다.
    이 def get()메서드는 바로 post()메서드를 호출하고, post()에 내장된 delete()메서드가 작동하여 성공적으로 글을 지울 수 있게 해준다. 이러한 일이 가능한 이유는, 우리가 모든 속성을 '상속' 받았기 때문이다.

🎨 여담

  • 우리의 일타강사 빛태훈이 요새는 장고로 프로그래밍을 하지 않는다고 한다. 나도 얼른 스택의 범위가 넓어져 다양한 언어로 개발하고 싶다.

0개의 댓글