1. FormView 소개
장고의 FormView는 반복된 작업을 줄이기 위해서 장고가 제공하는 클래스형 뷰인 Generic View 중 하나이다. 폼이 주어지면 해당 폼을 보여주고, 사용자가 폼에 값을 입력하면 처리하여 다른 url로 리다이렉트한다. 개발자가 입력해야 할 사항은 다음 네 가지다.
- form_class: 사용자에게 보여줄 폼을 정리한 forms.py 파일 내 클래스 명
- template_name: 폼을 포함하여 렌더링 할 템플릿 파일 이름
- success_url: 폼 처리가 정상적으로 되었을 때 사용자를 리다이렉트 시킬 URL
- form_valid(): 유효한 폼 데이터를 처리할 로직
2. 빈 Form 보여주기
사용자는 최초로 폼을 조회하기 위해 GET 메소드로 요청을 보낸다. 요청을 받은 FormView는 폼이 정의되어 있는 form_class를 입력값이 비어있는 상태로 리턴한다. form_class는 HTML로 렌더링되어 사용자에게 보내진다. 사용자는 Form에 정보를 입력하여 POST 메소드로 보낸다.
3. Form의 데이터 유효성 검증
Form이 POST 메소드로 전달되면 내부적으로 form.is_valid() 메소드를 호출한다. 이 메소드는 form이 비어있거나 에러가 없는지 확인한다.
#django/forms/forms.py
def is_valid(self):
"""Return True if the form has no errors, or False otherwise."""
return self.is_bound and not self.errors
에러가 있다면 form_invalid()를 호출하고 오류가 있는 입력 데이터를 그대로 반환한다. 에러가 없어서 form_valid()가 호출되면 지정된 success_url로 사용자를 리다이렉트 시킨다.
#django/views/generic/edit.py
def get_success_url(self):
"""Return the URL to redirect to after processing a valid form."""
if not self.success_url:
raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
return str(self.success_url) # success_url may be lazy
def form_valid(self, form):
"""If the form is valid, redirect to the supplied URL."""
return HttpResponseRedirect(self.get_success_url())
def form_invalid(self, form):
"""If the form is invalid, render the invalid form."""
return self.render_to_response(self.get_context_data(form=form))
위 코드는 FormView 부모 클래스의 코드 일부분이다. 위에서 확인할 수 있는 것처럼 success_url이 FormView의 인자로 전달되지 않으면 ImproperlyConfigured 에러를 발생시킨다.