티스토리 뷰

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 말고도 다양하게 쉽게 나와있다.

http://ruaa.me/django-view/

 

Django - 클래스형 뷰

아래 내용은 파이썬 웹프로그래밍(한빛출판사) 책의 내용을 재정리한 것입니다. 요약 클래스로 작성되어 있는 뷰 객체를 말한다. 상속과 믹스인 기능 사용으로 코드의 재사용이 가능 뷰의 체계적 관리 제네릭 뷰 작성 클래스형 뷰의 시작점 클래스형 뷰는 URLconf에서의 사용으로 시작한다. MyView 라는 클래스형 뷰를 사용한다면 URLconf의 모습은 다음과 같을 것이다. # urls.py from

ruaa.me

 

 

◎ 느낀 점

- 구글링하면 정말 내가 원하는 답만 딱! 나와있는 페이지만 보려고 했다. 그것도 심지어 글이 길면 잘 읽으려고 하지도 않았다. 하지만 이제는 해당 장고 홈페이지, stackoverflow 등 다양하게 볼 수 있도록 습관을만들었다. 영어로 길게 나와도 당황하지 않고 잘 해석하려고 노력한다. 많은 개발자들이 영어공부도 중요하다고 말하는 이유를 느꼈다. 그리고 잘 나와있는 페이지들이 많다. 그것들을 읽고 이해하면서 다시 내것으로 만드려고 노력했다. 상속받은 함수를 장고 홈페이지에 다시 검색해보고 파라미터와 반환값도 자세히 이해하려고 한다. 

댓글