IT 개발/Django
[Django] 장고, Form 사용법 (일반폼, 모델폼)
KADOSHOLY
2023. 12. 31. 01:42
반응형
Django - 장고, Form 사용법 (일반폼, 모델폼)
목차
- 장고 Form 이란?
- 일반폼 (forms.Form) 사용방법
- 모델폼 (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
- {{ form }} 삽입 위치에 forms.py에서 정의한 폼이 생성됩니다.
- {{ 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>
[실행결과]
모델폼을 사용하면 바로 데이터베이스에 저장할 수 있습니다.
반응형