웹 프로그래밍

Django form에 대한 정리

728x90
반응형

HTML <form/>

HTML에서 <form/>은 웹사이트를 사용하는 사용자가 데이터를 입력할 수 있도록 하고 서버로 데이터를 보내는 역할을 제공한다. 폼은 2가지 정보를 담고 있어야한다.

1) 서버로 보낼때 어디로 보낼지 2) HTTP 방법 명시. 데이터를 보낼때 HTTP 방법은 POST방식으로 보내기 되어 POST를 입력해준다. 예를 들어 아래를 보면

<input type="submit" value="Log in">

submit이 트리거가 되어 사용자가 Log in 버튼을 누르면 데이터가 전송이 되는 것이다.

 

DJANGO

폼을 핸들링한다는 것은 사용자를 위해 수많은 타입의 데이터 항목들을 필요로하고 화면에 보여야하며 이런 값들은 다시 서버로 보내진다. 이후에도 값에 대한 유효성겁증을 필요로 하며 검증 이후 데이터를 처리하는 로직도 필요하다. 

장고 폼은 이런 작업에 대한 단순화와 자동화를 제공한다. (보안적으로도 훌륭함)

 

1) 렌더링을 위해서 데이터를 준비하고 재구성해준다.

2) HTML 폼을 만들어준다.

3) 클라이언트로부터 제출이 된 데이터를 받고 처리해준다.

 

모델클래스의 필드가 데이터베이스 필드에 매칭되는 것처럼, 폼도 폼필드의 클래스는 html 요소, 즉 태그에 매핑된다. 폼이 제출되면 유효성검사까지 수행이 된다.

 

 

장고 폼사용을 위한 위한 의식의 흐름

 

사용자 이름을 받는 웹사이트가 있다고 생각해보자

<form action="{% url 'myform:index' %}" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

이름을 받을때 text input과 submit input이 있다. 받은 데이터는 myform:index로 전송되고 HTTP method는 POST method이다. 여기서는 코드 내용이 그닥 적지만 실제로는 폼관련코드가 복잡하고 양도 많을 것이다. 그중 많은 필드는 미리 데이터가 작성되어있어야하고 유효성검사도 필요로한다. 이때 장고 폼기능이 필요하다.

 

forms.py

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name name', max_length=7)

charField가지는 your_name 폼을 하나 가지고 있다. your_name 최대길이는 7제한(유효성확인가능), label명 설정가능.

위 코드에서는 form html코드를 작성하지 않고도 화면에 rendering하고 값을 받아 처리도한다.

 

Form 인스턴스는 is_valid()함수를 가지고 있다. is_valid()함수는 입력받은 폼에 대한 유효성 검사를 실행한다. 

is_valid() 함수가 호출되면 값이 유효하면 참이 리턴되고 cleaned_data에 값이 저장된다. 

 

views.py 

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import NameForm

def index(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)

        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect('/myform/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

    return render(request, 'myform/name.html', {'form': form})

def thanks(request):
    return render(request, 'myform/thanks.html')

GET 요청이 들어온다면 NameForm()을 통해서 비어있는 폼을 사용자화면에 보여줄것. 

POST요청이 들어온다면 NameForm(request.POST)를 통해서 받은 데이터와 폼을 묶어준다(바인딩해준다) form.is_valid()를 통해서 유효성 검사를 한다. 값이 유효하면 참이 리턴되어 thanks 페이지로 이동하고 아니면 다시 이름입력페이지가 보인다. 

참이 될땐 cleaned_data에 유효한 데이터는 모두 저장이 된다. 

 

템플릿에서 장고 폼에 대한 처리

name.html

<form action="{% url 'myform:index' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="OK">
</form>

GET요청이 들어왔을때 form을 context에 담아서 템플릿에 보냈다. 그럼 템플릿에서는 {{form}}을 작성해주면 forms.py에서 작성한 form관련 내용을 볼수 있다.

 

 


Cleaned_data 사용에 대해

forms.py 

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)

views.py

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/')

is_valid()를 통해서 유효성 검사 이후에 필요에 따라서 cleaned_data에 저장된 데이터를 가지고 오는거다. 

728x90
반응형

'웹 프로그래밍' 카테고리의 다른 글

Real-time Django with Channels  (0) 2021.08.15
AWS 요금정리  (0) 2021.07.29
Django Transaction  (0) 2021.07.20
GET과 POST 정리  (0) 2021.07.19
Django Model - OneToOneField  (0) 2021.07.19