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 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()
'django > basic' 카테고리의 다른 글
회원가입,로그아웃 // 장고 기본인증(2) (0) | 2022.04.19 |
---|---|
로그인처리(LoginView) , 프로필 수정 // 장고 기본인증(1) (0) | 2022.04.19 |
Form validation : django form(5) (0) | 2022.04.17 |
CSRF 공격&CSRF Token // django form(4) (0) | 2022.04.17 |
ModelForm // django Form(3) (0) | 2022.04.17 |