당신은 멋쟁이, 우리는 장고쟁이~

0%

Django Forms 9편 - Django 에서 폼만들기 2

The View


Django 웹사이트로 다시 전송된 폼 데이터는 뷰가 처리 합니다.


보편적으로, 폼을 발행했던 뷰가 처리합니다. 이는, 같은 로직들을 재사용하게 해줍니다.


폼을 다루기 위해서는,

뷰에서 폼을 발행하려고 하는 URL 을 위해 폼을 인스턴스화 시켜주어야 합니다.


Django 에서 폼을 다루려면, 폼을 출력할 URL 을 생각해놓고, 폼을 발행하기 전에, 폼을 인스턴스화 시켜주어야 한다는 이야기 입니다.



폼 인스턴스화 시켜주기



Django 프로젝트에서, buildingaform 이라는 앱을 따로 생성해주고

buildingaform 앱 안의 구조가 아래와 같다고 가정해 봅시다.


1
2
3
4
5
6
7
8
9
10
.
├── admin.py
├── apps.py
├── forms.py # 이전 포스팅에서 작성한 forms.py 파일
├── __init__.py
├── migrations
│   ├── __init__.py
├── models.py
├── tests.py
└── views.py # 전달된 폼데이터를 처리 혹은 폼을 인스턴스화

forms.py 파일이 생성되있는것을 확인할수 있고. views.py 가 전달된 폼 데이터를 처리 하거나, 폼을 인스턴스화 합니다.


views.py 파일을 간단하게 살펴보자면,



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.http import HttpResponseRedirect 
from django.shortcuts import render

from .forms import NameForm

def get_name(request):
if request.method == "POST":
# 요청이, POST 라면, form 인스턴스를 아래와 같이 생성해줍니다.
form = NameForm(request.POST)
# 유효한 데이터인지 검사하기 위해, is_valid 메서드를 사용해 줍니다.
if form.is_valid():
# form.cleaned_data 안에 있는 데이터를 요구사항에 맞게 처리할 로직을 작성합니다
# ..
# 새로운 URL 로 리다이렉트 시켜줍니다
return HttpResponseRedirect('/thanks/')
# 만약, GET 이나 다른 method 의 요청을 받으면, 비어있는 폼을 생성합니다
else:
form = NameForm()
return render(request, 'name.html', {'form': form})


Views.py 에서 폼을 처리하는 포인트


  • GET 요청으로 이 뷰에 요청이 들어오면

    해당 뷰는 비어있는 폼 인스턴스를 생성하고, 폼이 렌더될 템플릿 컨텍스트에 넣어놓습니다. 이것은, 우리가 처음 폼이 존재하는 URL 에 방문하였을때 예상할수 있는 일입니다. 비어있는 폼 인스턴스를 생성하였기 때문에, 비어있는 폼이 화면에 출력 됩니다.

  • POST 요청으로 사용자가 폼을 제출 하면

    해당 뷰는, 또다시 폼 인스턴스를 생성하는데, 요청으로부터 들어온 데이터를 채워줍니다 form=NameForm(request.POST). 이를 두고, 데이터를 폼에 묶어준다고 표현합니다.

  • is_valid() 메서드를 호출 합니다

    is_valid() 를 호출하였을때, True 가 반환되지 않는다면 (즉 False 가 반환될때), 폼과 함께 템플릿으로 다시 돌아갑니다. 이렇게 다시 폼이 출력되는 화면으로 돌아갈때에는, 비어 있는 폼이 아닐수 있습니다. 이전에 제출된 데이터로 채워져 있을것입니다. 따라서, 이전에 제출된 데이터들을 요구사항에 따라 수정 혹은 고쳐줄수 있습니다.

  • 만약 is_valid() 가 True 라면

    유효한 Form data 들을 cleaned_data 속성에서 찾을수 있을것입니다. 이 cleaned_data 속성 안에 드렁있는 데이터를 사용하여, 데이터베이스를 업데이트 하거나, 혹은 다른 처리과정을 HTTP redirect 를 하기전에 수행할수 있습니다.