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

0%

Django Forms 12편 - Django Form 클래스에 대해 2

Fields 에 대해서


이전 포스팅들에서 다루었었던 예시보다 좀더 유용한 폼을 한번 생각해 봅시다.


개인적인 웹사이트에 contact me 기능을 구현하는 폼을 생각해 봅시다. Contact Me 폼을 작성하기 위한 forms.py 파일은 아래와 같이 작성될수 있습니다.


1
2
3
4
5
6
7
8
from django import forms 


class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)

이전 포스팅에서 들었었던 폼의 예시는, 하나의 필드만 사용했었습니다. your_ name 과 CharField 만 사용햇었습니다.


하지만, 이번 경우에는, 4가지의 필드들을 가지고 있습니다.


Fields FieldTypes
subject CharField
message CharField(widget=forms.Textarea)
sender EmailField
cc_myself BooleanField


Widgets


각 폼의 필드는 그에 상응하는 Widget 클래스를 가지고 있습니다, 위의 예시에서는 widget=forms.Textarea 로 지정되어 <input type="text"> 같은 HTML 폼 widget 이 될것입니다.


대부분의 경우, 필드는 적당한 기본 widget 을 가지고 있을것입니다.


예를들면, 기본값으로 CharField 는 TextInput widget 을 가질것이고, 이는 <input type="text"> 를 HTML 안에서 만들어 내줍니다.


만약 <textarea> 가 필요했다면, 적절한 widget 을 Form 필드를 정의할때 지정해 주면 됩니다. 우리는 이것을 message 필드를 정의할때 지정해 주었습니다.




Field Data


어떤 데이터이든 폼과 함께 제출되었고, is_valid() 함수를 호출하여 성공적으로 검증되었으면 (is_valid() 가 True 를 반환했을때),


검증된 폼 데이터는 form.cleaned_data 에 사전 형태로 있을것입니다. 이 데이터는 여러분들을 위해 python 데이터 타입으로 좋게 전환되어 있습니다.


NOTE

우리는 여전히 검증되지 않은 데이터들을, request.POST 를 사용하여

직접 엑세스 할수 있습니다. 하지만, 검증된 데이터를 다루는것이 더 좋습니다.


위에 있는 contact form 예시에서, cc_myself 는 불리언 값이 될것 입니다. 비슷하게도, IntegerField 와 FloatField 같은 필드들은, Python 이 값을 int 와 Float 으로 전환 합니다.


Form 데이터 처리하기


폼에서 제출된 데이터가, is_valid() 함수를 사용하여 검증이 된 데이터라고 할때, 아래 예시에서는 어떻게 폼에서 받은 데이터를 뷰에서 다룰수 있는지 간단하게 보여줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.core.mail import send_mail 

if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']

recipients = ['info@example.com']
if cc_myself:
recipients.append(sender)

send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')

기본적으로, form.is_valid() 가 True 이면, 각 필드들에 입력된 데이터들은, form.cleaned_data['subject'] 같은 형식에 담아져 있습니다. 이는, 검증된 폼 데이터가 form.cleaned_data 에 사전 형태로 저장되어 있기 때문입니다.


이 예시에서, send_mail 에 대한 구현은 다루지 않습니다. 이 send_mail 을 더 알고 싶으면, Django 에서 이메일 보내기를 더 알아야 합니다.

Sending Email 문서를 참조하면 되는데, 처음엔 무슨 소리인지 이해가지 않을겁니다.


몇가지 필드 타입들은 추가적인 처리가 필요할수 있습니다. 예를들면, 폼을 사용하여 업로드된 파일들은 좀 다르게 다루어질 필요가 있습니다.

이런 파일들은 (request.POST 보다는 request.FILES 로 조회될수 있습니다)


어떻게 업로드된 파일들을 다루는지에 대해서는, binding uploaded files to a form 문서를 확인하시면 됩니다.