WEB

[Django 08] Forms

mhko411 2021. 3. 16. 20:31
728x90

HTML의 form을 통해 사용자가 입력한 정보를 서버에 전달하여 조회, 생성, 수정, 삭제 등을 할 수 있다. 하지만 사용자가 입력한 정보를 "유효성 검사"를 실시하여 알맞은 데이터를 저장할 수 있도록 한다. 이 과정은 꽤 복잡할 수 있는데 Django에서는 Forms라는 클래스를 통해 이러한 복잡한 과정을 축소할 수 있다.

 

(Django 공식 사이트와 MDN을 참고한다.)


Form이란

<form> 태그 안에는 최소 한 개 이상의 <input type="submit">을 포함하여 여러가지의 <input>으로 이루어져있다. <input>의 type 속성을 통해 다양한 위젯을 표현할 수 있다. 

사용자가 <input> 안에 어떠한 데이터를 입력하고 submit 버튼을 눌렀다면 <form>의 action에 정의된 주소로 전달된다. action에는 데이터를 전달받은 곳의 URL 주소를 설정하며, 설정하지 않았을 때는 현재 페이지로 보낸다.

그리고 method라는 속성을 정의할 수 있는데 대표적으로 "POST"와 "GET"이 존재한다.

POST는 CSRF 공격에 저항할 수 있도록 만들 수 있기 때문에 입력된 데이터를 데이터베이스에 저장하거나 변경사항을 일으킬 때 사용된다. 

GET은 사용자가 데이터를 변경하지 않을 때 사용된다.

 

Django의 Form 작성하기

1. Form 선언하기

Django에서 "Form" 클래스를 통해 Form을 관리하기 위해서는 애플리케이션의 폴더에 forms.py를 생성한다. 게시판을 만드는 애플리케이션에서 Form을 입력받는다고 가정하자.

Model을 선언할 때와 유사하다는 것을 알 수 있다. 게시판을 작성할 때 제목과 내용을 입력받도록 하며 CharField를 사용하면 기본적으로 TextInput값이 설정되어 텍스트를 입력받도록 한다. 하지만 content처럼 필드 안에 인자를 전달할 수 있다. 어떠한 인자들이 있는지 알아보자.

- required : True로 설정되어 있을 때 필드를 빈 칸으로 둘 수 없다.

- label : HTML에서 필드를 렌더링할 때 사용하며 지정되어있지 않다면 필드 이름과 유사하게 설정된다.

- initial : 폼에 설정되는 초기 값을 의미한다.

- widget : 태그에 사용할 디스플레이 위젯을 설정할 수 있다.

- validators : 해당 필드가 유효한 값을 가질 때 호출되는 함수의 목록이다.

# forms.py
from django import forms

class PostForm(forms.Form):
	title = forms.CharField(max_length=10)
	content = forms.CharField(widget=forms.Textarea)

 

2. VIEW 작성하기

이제 새로운 데이터를 입력받거나 기존의 데이터를 수정하는 URL로 이동했을 때 처리하는 VIEW를 작성해보자.

먼저 views.py에 forms.py에서 정의한 클래스를 불러온다.

그리고 form 인스턴스를 생성하여 사용자가 전달한 데이터로 채운다. 이후 is_valid()를 통해 유효성 검사를 하여 True일 때 다른 페이지를 보여주도록 한다.

# views.py
from .forms import PostForm

def create(request):
	if request.method == 'POST':
		# form 인스턴스 생성
		post = PostForm(request.POST)
        # 유효성 검사
		if post.is_valid():
			return redirect()

 

3. TEMPLATE 작성하기

Form 클래스로 정의한 필드를 실제 Template에 적용하여 사용자가 입력할 수 있도록 하자.

VIEW 함수에서 GET 요청을 받으면 생성한 form 인스턴스를 context에 담아서 Template에 전달한다.

 

그렇다면 HTML 문서에서는 다음과 같이 적용시킬 수 있다. POST 요청을 하는 <form> 안에 forms.py에서 정의한 필드들을 채운다. 

<form method="POST">
<%csrf_token%>
{{ form }}
<button>제출</button>
</form>

간단하게 Django Forms를 알아봤고 다음에는 이를 활용하여 CRUD 시스템을 만들어봐야겠다.

'WEB' 카테고리의 다른 글

[WEB] 토큰 기반 인증과 JWT  (0) 2021.10.13
[Django 09] Authentication  (0) 2021.03.23
[Django 07] CRUD  (0) 2021.03.11
[Django 06] Model  (0) 2021.03.10
[Django 05] form 사용하기  (0) 2021.03.09