Generic editing views // Forms(6)

2022. 4. 18. 00:54
  • 인프런 이진석 강사님의 장고강의를 참고
  • 장고의 form에 관한 기능을 처리할 수 있는 CBV인 Generic editing views들에 대하여 다룸

Generic editing views

  • 장고의 form기능을 다룰 수 있는 CBV들
  • FormView, CreateView, UpdateView, DeleteView가 있으며(심지어 CRUD중에서도 많은 기능을 차지), 만약 FBV형태로 동일한 기능을 구현할 경우 Form을 사용하게 된다.(그래서 View임에도 Form과 관련된 주제에서 다룸) 

 

Generic editing views의 부모클래스들

  • Generic editing view들도 앞서 다루었던 CBV들처럼 이런저런 부모 클래스들을 상속받아 완성된다

Form관련 CBV들의 관계도. (출처 : 인프런 이진석 강사님의 장고강의)

Form Mixin

  • get요청시 빈Form을 만들어서 보여줘야 하는데, 그 역할을 FormMixin클래스의 get_context_data멤버함수가 담당
  • get_success_url값이 있는지 확인하고, 없으면 에러를 발생시킴
  • form_valid // form_invalid관련

 

ProcessFormView

  • get ,post멤버함수를 가지고 있으며 요청 메서드에 따라 해당 멤버함수가 호출됨
  • get 멤버함수 : render_to_response를 통해 FormMixin의 get_context_data를 호출하여 빈폼을 받고, 템플릿에 빈폼을 전달함. 마치 FBV에서 get요청시 빈폼을 보여주는 느낌
  • post 멤버함수 : post메서드로 들어온 데이터를 인자로 받은 form객체를 만들고 유효성 검사를 진행. 마치 FBV에서 Post메서드요청이 들어왔을 때 진행되던 로직과 유사함

 

ModelFormMixin

  • get_form_class
    • 현재 form_class가 있다면 해당 form_class를 반환
    • 만약 form_class가 없는데 model이 설정되어 있다면(+필드정보가 있다면) 해당 model기반의 modelform을 생성
  • get_form_kwargs
    • FBV에서 모델폼을 기반으로 모델의 인스턴스를 업데이트 할 때, form객체에 모델instance를 넣어줫었음
    • 그 작업을 get_form_kwrags 멤버함수에서 함. self.object가 존재한다면, instance라는 key에 해당 self.object를 value로 배정
  • get_success_url
    • 기능수행 성공시 이동할 url의 문자열을 획득
    • get_absolute_url이 있다면, get_absolute_url값을 그대로 받음

 


Createview / UpdateView

  • 어떤 form 혹은 어떤 model을 선택할지만 정해주면 된다.
  • 모델만 지정할 경우(form이 없을 경우), createview내부적으로 알아서 modelform을 만들어 줌
  • 사용할 템플릿 이름을 변경시켜줄 경우, template_name_suffix에 값을 주면 됨
    • default값은 '_form'이며, 그대로 둘 경우 '모델명_form.html'를 찾아서 랜더링함

 

Createview / UpdateView 예시

  • model과 form_class를 설정해주었음
  • LoginRequiredMixin > 로그인해야만 해당 CBV를(의 as_view()를) 호출할 수 있도록 해줌
  • CreateView는 form_valid를 재정의하여, form에서 채워지지 않은 모델의 필드(여기선 author)를 채워주었음
  • UpdateView는 이미 author가 있으므로 form_valid를 재정의할 필요가 없음
#createview , updateview
from django.views.generic import CreateView,UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin


class PostCreateView(CreateView,LoginRequiredMixin):
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        self.object=form.save(commit=False)
        self.object.author = self.request.user
        return super().form_valid(form)
    
class PostUpdateView(UpdateView,LoginRequiredMixin):
    model = Post
    form_class = PostForm

post_new = PostCreateView.as_view()
post_edit = PostUpdateView.as_view()

 

DeleteView

  • Post멤버함수 요청시 , self.object.delete()를 호출해서 실제로 객체를 삭제
  • 삭제가 완료되면 success_url로 redirect

 

DeleteView 예시

  • deleteview는 사실 별거 없음
  • 근데 success_url의 경우 그냥 reverse를 사용하면 읽어지지가 않음. 파이썬의 구조적인 문제에 기인한 것으로, instagram:post_list에 대한 urlreverse기능이 작동하지 않는다.(먼저 작동되어서 그럼)
  • reverse_lazy를 사용하면, success_url이 필요해지는 그 순간에 instagram:post_list의 값을 읽어옴(즉 실행되어야 될 것들이 다 실행되고 나서, 정말 필요해지는 그순간에 instagram:post_list의 값을 가져오는 것임) 
from django.views.generic import DeleteView
from django.urls import reverse_lazy

class PostDeleteView(DeleteView,LoginRequiredMixin):
    model = Post
    success_url = reverse_lazy('instagram:post_list')
post_delete = PostDeleteView.as_view()

 

BELATED ARTICLES

more