티스토리 뷰
why return super().form_valid(form)
- 항상 return super().form_valid(form)을 왜 하는지 이해를 못했다.
◎ WHY ?
class RegisterView(FormView):
template_name = 'register.html'
form_class = RegisterForm
success_url = '/login'
def form_valid(self, form):
user = Users(
email = form.data.get('email'),
password = make_password(form.data.get('password')),
level = 'user'
)
user.save()
return super().form_valid(form)
회원가입을 예로 들었을 때, 127.0.0.1:8000/register 의 경로로 입력
1. urls.py에 나온대로 path('register/', RegisterView.as_view()) view에 있는 RegisterView로 넘어간다.
2. ReigsterView에서 상속받은 FormView로 인해 폼을 보여줄 수 있는 기능을 갖는다.
3. 그럼 어떤 폼을 보여줄 것인지는 form_class 에 해당하는 폼 이름을 지정한다.
4. 그 다음으로 어떻게 보여줄 것인지 template_name 에 html 파일을 지정한다. 그러면 폼과 함께 렌더링하여 화면에 보여준다.
5. register.html 에 있는 폼을 입력하고 회원가입 버튼을 누르면 POST로 요청된다. 그러면 RegisterForm에서는 해당 값들이 유효한 데이터(cleaned_data)인지 확인한다.
6. 값들이 유효하다면, 이제 폼 자체가 유의한지 확인해야한다. 다시 view로 넘어와서 form_valid 함수를 실행한다. form_valid에서는 유효한 폼 데이터로 객체를 생성하고 DB에 저장한다.
7. 다 끝난 다음엔 어떻게 할 것인가? RegisterView 기능이 정상적으로 모두 끝난 후에 연결할 페이지는 success_url 에서 URL 지정을 하면 된다. 그러면 알아서 이동해준다.
8. 그러면 왜 super().form_valid(form)은 왜 하는 것이며.. 무슨 역할을 하는가?
◎ 알게된 정보
1. super()
- 슈퍼클래스의 메소드를 호출한다. 그러면 super().form_valid(form)은 슈퍼클래스인 FormView의 메소드 form_valid 를 호출하겠다는 의미이다.
2. form_valid(form)
- form_valid() 함수는 유효한 폼 데이터로 처리할 로직 코딩
- form_valid는 django.http.HttpResponse를 반환한다.
- 장고홈페이지에는 아래와 같이 나와있다.
유효한 폼데이터가 POST 요청되었을 때 form_valid 메소드가 호출된다. form_valid는 단순히 success_url로의 연결을 수행한다.
클래스형 뷰 폼처리
class MyView(View):
template_name = 'mytemplate.html'
if form.is_valid():
#cleaned_data로 관련 로직 처리
return HttpResponseRedirect('/success/')
return render(request, self.template_name, {'form':form})
FormView를 상속받은 폼처리
class MyView(FormView):
success_url = '/success/'
form_class = MyForm
template_name = 'mytemplate.html'
def form_valid(self, form)
return super(MymView, self).form_valid(form)
위와 아래의 코드가 같은 기능을 한다. 이로 인해 form_valid 가 무슨 역할을 하는지 알 수 있다.
위의 코드(CBV 폼처리)에서 cleaned_data 관련 로직을 성공적으로 수행하면 return HttpResponseRedirect('/success/')을 통해서 success 페이지로 이동한다.
그리고 return render(request, self.template_name, {'form':form})을 통해서 폼과 함께 해당 템플릿 페이지를 보여준다.
아래의 코드에서는 (FormView 상속 폼처리) FormView를 상속받았기 때문에 폼과 html 렌더링 하는 코드가 필요없이 form_class = MyForm 으로 정의하면 django에서 알아서 해주는 것이다.
그리고 form_valid 함수를 통해서 cleaned_data 관련 로직을 수행하고 성공적으로 마치면 알아서 success_url에서 정의한 페이지로 폼과 함께 이동해준다.
결국 FormView를 상속받으면서 코드가 간단해진 것이다..... 엄청나게 특별한 기능은 없던 것이다...
아래의 블로그가 정말로 잘 나와있다. FormView 말고도 다양하게 쉽게 나와있다.
Django - 클래스형 뷰
아래 내용은 파이썬 웹프로그래밍(한빛출판사) 책의 내용을 재정리한 것입니다. 요약 클래스로 작성되어 있는 뷰 객체를 말한다. 상속과 믹스인 기능 사용으로 코드의 재사용이 가능 뷰의 체계적 관리 제네릭 뷰 작성 클래스형 뷰의 시작점 클래스형 뷰는 URLconf에서의 사용으로 시작한다. MyView 라는 클래스형 뷰를 사용한다면 URLconf의 모습은 다음과 같을 것이다. # urls.py from
ruaa.me
◎ 느낀 점
- 구글링하면 정말 내가 원하는 답만 딱! 나와있는 페이지만 보려고 했다. 그것도 심지어 글이 길면 잘 읽으려고 하지도 않았다. 하지만 이제는 해당 장고 홈페이지, stackoverflow 등 다양하게 볼 수 있도록 습관을만들었다. 영어로 길게 나와도 당황하지 않고 잘 해석하려고 노력한다. 많은 개발자들이 영어공부도 중요하다고 말하는 이유를 느꼈다. 그리고 잘 나와있는 페이지들이 많다. 그것들을 읽고 이해하면서 다시 내것으로 만드려고 노력했다. 상속받은 함수를 장고 홈페이지에 다시 검색해보고 파라미터와 반환값도 자세히 이해하려고 한다.
- Total
- Today
- Yesterday
- 데이터베이스 추천
- django pythoneverywhere
- iOS 검은 화면
- 까만 화면
- django 로그인접근
- 웹 배포
- django clean
- Realtime Database
- django tag
- python 웹 배포
- Firebase 데이터베이스 추천
- ModelForm Form 차이
- CellForRowAt Not Called
- 장고 게시판
- UITableViewController Not Working
- CellForRowAt 호출안됨
- 테이블출력안됨
- 장고 태그달기
- iOS UITableView 출력안됨
- django 태그
- django 개발일지
- pythonanywhere배포
- 실시간 데이터베이스
- iOS 데이터베이스
- iOS 화면 안나옴
- pythonanywhere배포방법
- 알파벳 카운팅
- cleaned_data
- Django
- django 게시판
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |