파이썬으로 장고(Django) 공략하기: 입문 강의를 정리한 내용입니다.

Django Form

  • 장고 프레임워크 단에서 폼을 구성하기 쉽도록 지원하고 있다.
    • binding : 모델 클래스의 모델 정보들과 연동할 수 있다.
    • Validation 체크 : 입력된 정보들의 유효성 검사를 쉽게 해준다.
    • sanitisation : 악의적인 데이터를 필터링 한다.
    • 짧고 간결한 코드로 폼 인터페이스를 구현한다.

장고 폼 생성

  • 폼 데이터를 위한 폼 클래스를 선언한다.
  • 폼 클래스의 필드는 django 의 forms를 통해 선언하는 데, models.py에서 모델 클래스를 선언하는 방법과 유사하다.
  • 해당 필드의 속성들은 소괄호 내에서 정의한다.
  • CharField 타입의 기본 위젯은 input type=”text”이다.
  • 주로 사용되는 필드는 BooleanField, CharField, ChoiceField, DateField, EmailField, FileField, FloatField, ComboField 등이 있다. 그 외에 어떤 속성과 필드가 있는 지는 장고 문서에서 확인하자.
# second/form.py
from django import forms

class PostForm(forms.Form): # django Form 클래스를 상속
    # label : 폼에서 텍스트로 보여지는 것을 설정
    title = forms.CharField(label="제목", max_length=200)
    content = forms.CharField(label="내용", widget=forms.Textarea)
  • view 메소드를 추가한다.
# second/views.py
from . forms import PostForm

def create(request):
    form = PostForm()
    return render(request, 'second/create.html', { 'form': form })
  • 폼 템플릿 파일을 추가한다.
    • csrf_token : 유효한 요청임을 검증하기 위한 문자열. 템플릿으로 만들어둔 폼을 통해서만 데이터가 들어오도록 만든다.
    • 입력받은 form 변수를 출력하게 되면 PostForm 클래스에서 선언한 필드대로 html로 변환되서 출력된다.
<!-- second/templates/second/create.html -->
<form action="/" method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">제출</button>
</form>
  • 지정한 view 메소드를 url과 연결한다.
# second/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('list/', views.list, name="list"),
    path('create/', views.create, name="create"),
]

폼 데이터 전송

  • create 페이지의 폼에서 입력한 데이터를 confirm 페이지에서 조회되도록 만든다.
  • view 메소드를 추가한다.
# second/views.py
from django.http import HttpResponseRedirect

def confirm(request):
    # POST로 넘어온 데이터를 바로 PostForm 클래스의 생성자에 전달한다.
    form = PostForm(request.POST)
    if form.is_valid(): # 정의한 validation 조건 통과
        return render(request, 'second/confirm.html', { "form": form })
    # 데이터가 유효하지 않으면 create 입력 폼으로 리다이렉트
    return HttpResponseRedirect('/second/create/')
  • confirm 템플릿을 추가한다.
<!-- second/templates/second/confirm.html -->
<body>
    <h4>{{ form.title.value }}</h4>
    <p>{{ form.content.value }}</p>
</body>
  • view 메소드에 url을 연결한다.
# second/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('list/', views.list, name="list"),
    path('create/', views.create, name="create"),
    path('confirm/', views.confirm, name="confirm")
]
  • create 페이지에서 요청 url을 수정한다.
<!-- second/templates/create.html -->
<form action="{% url 'confirm' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">제출</button>
</form>