IT 개발/Django

[Django] 장고, Form 사용법 (일반폼, 모델폼)

KADOSHOLY 2023. 12. 31. 01:42
반응형

 

Django - 장고, Form 사용법 (일반폼, 모델폼)

 

 

   목차

  1. 장고 Form 이란?
  2. 일반폼 (forms.Form) 사용방법
  3. 모델폼 (forms.ModelForm) 사용방법

 

 

1. 장고 Form 이란?

 

웹사이트에서 사용자로부터 데이터를 입력받아 서버로 전송하고자 할 때 html에서 <form> 태그를 사용합니다.

이러한 <form> 태그를 사용하여 서버와 데이터를 주고 받을 경우, 데이터의 유효성 검사 등 여러가지 해야할 작업들이 많이 있는데, 장고에서는 이러한 일들을 조금 단순화하여 편리하게 사용할 수 있도록 form 기능을 따로 제공하고 있습니다.

장고에서 제공하는 form에는 크게 일반폼(forms.Form)과 모델과 연결하여 데이터베이스를 사용할 수 있는 모델폼(forms.ModelForm)이 있습니다. 

 

 

 

2. 일반폼 (forms.Form) 사용방법

 

1) testapp > forms.py 생성

  •  forms.py 파일을 새로 만든후 아래와 같이 NameForm 클래스를 정의합니다. 
from django import forms

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

 

2) testapp > views.py 생성

  • forms.py에서 만든 NameForm() 객체를 form_normal.html에 전달해 줍니다. 
from django.shortcuts import render
from testapp.forms import NameForm

def form_normal(request):
    if request.method == 'POST':
        form = NameForm(request.POST)
        if form.is_valid():
            your_name = form.cleaned_data['your_name']
            print(your_name)
            # return redirect('/testapp/form_normal')
    else:
        form = NameForm()

    your_name = request.POST.get('your_name')

    return render(request, 'testapp/form_normal.html', 
                  {'form':form, 'your_name':your_name})

 

3) testapp > urls.py

urlpatterns = [
    path("form_normal", views.form_normal),
]

 

4) templates > testapp > form_normal.html

  1. {{ form }} 삽입 위치에 forms.py에서 정의한 폼이 생성됩니다. 
  2. {{ form }} 대신 {{ form.as_p }}를 넣으면 <p> 태그로 한번 감싸서 form을 생성해줍니다. 
    • ex) {{ form }}, {{ form.as_p }}, {{ form.as_table }}, {{ form.as_ul }}
<!DOCTYPE html>
<html lang="en">
<head> ... </head>
<body>
    <h3>보내는 데이터</h3>
    <form action="/testapp/form_normal" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Submit">
    </form>
    <hr>
    <h3>받는 데이터</h3>
    your_name : {{ your_name }}<br>
</body>
</html>

 

[실행결과]

  • 실제 생성된 html 코드를 살펴보면  {{ form }} 위치에 아래와 같이 <input> 태그가 삽입되어 있습니다. 

 

 

 

 

3. 모델폼 (forms.ModelForm) 사용방법

 

모델폼을 사용하면 model과 연결하여 데이터베이스에 접근하여 사용할 수 있습니다. 

 

1) testapp > models.py

from django.db import models

class TestTb(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20, blank=True, null=True)
    age = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'test_tb'

 

2) testapp > forms.py

from django import forms
from testapp.models import TestTb

class TestTbForm(forms.ModelForm):
    class Meta:
        model = TestTb

        fields = ['id', 'name', 'age']
        widgets = {
            'id': forms.TextInput(attrs={'required':True, 'size':10}),
            'name': forms.TextInput(attrs={'required':False, 'size':10}),
            'age': forms.TextInput(attrs={'required':False, 'size':10}),
        }

        labels = { 
            'id': '아이디',
            'name': '이름',
            'age': '나이', 
        }

 

3) testapp > views.py

from testapp.forms import TestTbForm

def form_model(request):
    if request.method == 'POST':
        form = TestTbForm(request.POST)
        if form.is_valid():
            testtb = form.save(commit=False)
            testtb.save()
            # return redirect('/testapp/form_model')
    else :
        form = TestTbForm()

    id = request.POST.get('id')
    name = request.POST.get('name')
    age = request.POST.get('age')

    return render(request, 
                  'testapp/form_model.html', 
                  {'form':form, 'id':id, 'name':name, 'age':age})

 

4) urls.py

urlpatterns = [
    path("form_model", views.form_model),
]

 

5) templates > testapp > form_model.html

<!DOCTYPE html>
<html lang="en">
<head>...</head>
<body>
    <h3>보내는 데이터</h3>
    <form action="/testapp/form_model" method="post">
        {% csrf_token %}
        {{ form.as_table }}
        <input type="submit" value="Submit">
    </form>
    <hr>
    <h3>받는 데이터</h3>
    id : {{ id }}<br>
    name : {{ name }}<br>
    age : {{ age }}<br>
</body>
</html>

 

[실행결과]

 

모델폼을 사용하면 바로 데이터베이스에 저장할 수 있습니다. 

반응형