본문 바로가기

프로그래밍/백엔드

[django] FormView의 사용자 입력 처리과정

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 에러를 발생시킨다.