Django Form
1. ํผ(Form)์ด๋?
์ฌ์ฉ์ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๊ฒ์ฆํ๋ ๋๊ตฌ
โข
Django์ forms ๋ชจ๋์ ์ฌ์ฉ
โข
HTML <form> ํ๊ทธ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ค
Django Form์ ์ฃผ์ ๊ธฐ๋ฅ
๋ค์์ Django Form์ ์ฃผ์ ๊ธฐ๋ฅ์ ํ๋ก ์ ๋ฆฌํ ๊ฒ์
๋๋ค:
๊ธฐ๋ฅ | ์ค๋ช
|
๋ฐ์ดํฐ ๊ฒ์ฆ | ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฐ์ดํฐ์ ์ ํจ์ฑ์ ์๋์ผ๋ก ๊ฒ์ฌ |
HTML ์์ฑ | ํผ ํ๋์ ๋ํ HTML ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑ |
๋ฐ์ดํฐ ๋ณํ | POST ๋ฐ์ดํฐ๋ฅผ ํ์ด์ฌ ๋ฐ์ดํฐ ํ์
์ผ๋ก ๋ณํ |
๋ณด์ ๊ธฐ๋ฅ | CSRF ๋ณดํธ์ ๊ฐ์ ๋ณด์ ๊ธฐ๋ฅ ์ ๊ณต |
์๋ฌ ์ฒ๋ฆฌ | ํผ ๊ฒ์ฆ ์คํจ ์ ์๋ฌ ๋ฉ์์ง ๊ด๋ฆฌ |
์ด๊ธฐ๊ฐ ์ค์ | ํผ ํ๋์ ์ด๊ธฐ๊ฐ์ ์ฝ๊ฒ ์ค์ ๊ฐ๋ฅ |
2. ํผ์ ์ข
๋ฅ
์ข
๋ฅ | ์ค๋ช
| ํด๋์ค |
์ผ๋ฐ ํผ | ์ฌ์ฉ์ ์ ์ ์
๋ ฅ ํ๋ | forms.Form |
๋ชจ๋ธ ํผ | ๋ชจ๋ธ ๊ธฐ๋ฐ ์๋ ์์ฑ | forms.ModelForm |
3. ์ผ๋ฐ Form ์์
# forms.py
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
Python
๋ณต์ฌ
# views.py
from .forms import ContactForm
def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# ์ฒ๋ฆฌ ๋ก์ง
return redirect('success')
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})
Python
๋ณต์ฌ
4. ModelForm ์์
# models.py
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
Python
๋ณต์ฌ
# forms.py
from .models import Post
from django import forms
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
Python
๋ณต์ฌ
# views.py
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'post_form.html', {'form': form})
Python
๋ณต์ฌ
5. ํ
ํ๋ฆฟ์์ ํผ ๋ ๋๋ง
<!-- post_form.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">๋ฑ๋ก</button>
</form>
HTML
๋ณต์ฌ
ํผ ๋ ๋๋ง ๋ฐฉ์
๋ฉ์๋ | ์ค๋ช
| ์ถ๋ ฅ ํํ |
as_p() | ๊ฐ ํ๋๋ฅผ <p> ํ๊ทธ๋ก ๊ฐ์ธ์ ์ถ๋ ฅ | ๋จ๋ฝ ํํ๋ก ๊ตฌ๋ถ๋์ด ํ์ |
as_table() | ๊ฐ ํ๋๋ฅผ <tr> ํ๊ทธ๋ก ๊ฐ์ธ์ ์ถ๋ ฅ | ํ
์ด๋ธ ํ ํํ๋ก ํ์ |
as_ul() | ๊ฐ ํ๋๋ฅผ <li> ํ๊ทธ๋ก ๊ฐ์ธ์ ์ถ๋ ฅ | ๋ชฉ๋ก ์์ดํ
ํํ๋ก ํ์ |
Tip: ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์์ as_p()์
๋๋ค.
6. ์ ํจ์ฑ ๊ฒ์ฌ & ์ปค์คํ
์ ํจ์ฑ
๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ
Django Form์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ ํ์
์ ๋ฐ๋ฅธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
# forms.py
from django import forms
from django.core.validators import RegexValidator
class UserForm(forms.Form):
username = forms.CharField(
validators=[
RegexValidator(
regex='^[a-zA-Z]{6,}$',
message='์์ด๋๋ ์๋ฌธ 6์๋ฆฌ ์ด์์ด์ด์ผ ํฉ๋๋ค.',
code='invalid_username'
)
]
)
password = forms.CharField(
widget=forms.PasswordInput,
validators=[
RegexValidator(
regex='^(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$',
message='๋น๋ฐ๋ฒํธ๋ 8์๋ฆฌ ์ด์์ด๋ฉฐ, ํน์๋ฌธ์๋ฅผ 1๊ฐ ์ด์ ํฌํจํด์ผ ํฉ๋๋ค.',
code='invalid_password'
)
]
)
Python
๋ณต์ฌ
์ปค์คํ ์ ํจ์ฑ ๊ฒ์ฌ
clean_ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ฌ์ฉ์ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
from django import forms
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
import re
class UserForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
def clean_username(self):
username = self.cleaned_data['username']
if not re.match(r'^[a-zA-Z]{6,}$', username):
raise ValidationError('์์ด๋๋ ์๋ฌธ 6์๋ฆฌ ์ด์์ด์ด์ผ ํฉ๋๋ค.', code='invalid_username')
if User.objects.filter(username=username).exists():
raise ValidationError('์ด๋ฏธ ์กด์ฌํ๋ ์์ด๋์
๋๋ค.')
return username
def clean_password(self):
password = self.cleaned_data['password']
if not re.match(r'^(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$', password):
raise ValidationError('๋น๋ฐ๋ฒํธ๋ 8์๋ฆฌ ์ด์์ด๋ฉฐ, ํน์๋ฌธ์๋ฅผ 1๊ฐ ์ด์ ํฌํจํด์ผ ํฉ๋๋ค.', code='invalid_password')
return password
Python
๋ณต์ฌ
์ ํจ์ฑ ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ form.errors๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
7. ์ค์ต ๊ณผ์ ์์
์ค์ต ์ฃผ์ | ์ค๋ช
|
์ฐ๋ฝ์ฒ ํผ ๋ง๋ค๊ธฐ | ์ด๋ฆ, ์ด๋ฉ์ผ, ๋ฉ์์ง ์
๋ ฅ ํ DB ์ ์ฅ ๋๋ ์ฝ์ ์ถ๋ ฅ |
๊ฒ์๊ธ ์์ฑ ํผ | Post ๋ชจ๋ธ ๊ธฐ๋ฐ์ ModelForm ๋ง๋ค๊ธฐ |
๋ก๊ทธ์ธ ํผ | ์ฌ์ฉ์ ์
๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ ํฌํจ |
๋ณด๋์ค: ์์ ฏ & ์คํ์ผ ์ ์ฉ
class StyledForm(forms.Form):
name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
Python
๋ณต์ฌ
์์ฝ
๊ธฐ๋ฅ | ์ค๋ช
|
forms.Form | ์ผ๋ฐ ํผ ํด๋์ค, ์๋์ผ๋ก ํ๋๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ |
forms.ModelForm | ๋ชจ๋ธ๊ณผ ์ฐ๋๋ ํผ ํด๋์ค, ๋ชจ๋ธ ํ๋ ๊ธฐ๋ฐ ์๋ ์์ฑ |
form.is_valid() | ํผ ๋ฐ์ดํฐ์ ์ ํจ์ฑ ๊ฒ์ฌ ์ํ |
form.cleaned_data | ์ ํจ์ฑ ๊ฒ์ฌ ํ ์ ์ ๋ ๋ฐ์ดํฐ์ ์ ๊ทผ |
form.save() | ModelForm์์ ๊ฒ์ฆ๋ ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅ |
Django ํ์๊ฐ์
๊ธฐ๋ฅ ๊ตฌํ ์์
1. ๊ธฐ๋ณธ ๊ฐ์
โข
Django์ ๊ธฐ๋ณธ User ๋ชจ๋ธ (django.contrib.auth.models.User) ์ฌ์ฉ
โข
forms.ModelForm์ผ๋ก ํ์๊ฐ์
ํผ ์์ฑ
โข
๋น๋ฐ๋ฒํธ๋ ํด์์ฒ๋ฆฌ ๋์ด ์ ์ฅ๋จ (set_password() ์ฌ์ฉ)
2. ํผ ๋ง๋ค๊ธฐ (forms.py)
# accounts/forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class SignupForm(UserCreationForm): # UserCreationForm์ ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ ํฌํจ
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
Python
๋ณต์ฌ
3. ๋ทฐ ํจ์ ๋ง๋ค๊ธฐ (views.py)
# accounts/views.py
from django.shortcuts import render, redirect
from .forms import SignupForm
from django.contrib import messages
def signup_view(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, 'ํ์๊ฐ์
์ด ์๋ฃ๋์์ต๋๋ค!')
return redirect('login') # ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
else:
form = SignupForm()
return render(request, 'accounts/signup.html', {'form': form})
Python
๋ณต์ฌ
4. URL ์ค์ (urls.py)
# accounts/urls.py
from django.urls import path
from .views import signup_view
urlpatterns = [
path('signup/', signup_view, name='signup'),
]
Python
๋ณต์ฌ
# ํ๋ก์ ํธ urls.py์ ์ฑ URL ์ฐ๊ฒฐ
# mysite/urls.py
from django.urls import path, include
urlpatterns = [
path('accounts/', include('accounts.urls')), # http://localhost:8000/accounts/signup/
]
Python
๋ณต์ฌ
5. ํ
ํ๋ฆฟ ์์ฑ (signup.html)
<!-- templates/accounts/signup.html -->
<h2>ํ์๊ฐ์
</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">๊ฐ์
ํ๊ธฐ</button>
</form>
HTML
๋ณต์ฌ
6. ์๋ ํ๋ฆ ์์ฝ
1.
์ฌ์ฉ์๊ฐ /accounts/signup/ ํ์ด์ง๋ก ์ด๋
2.
๊ฐ์
ํผ์ ์
๋ ฅ ํ ์ ์ถ
3.
Django๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ ํ User ๊ฐ์ฒด ์์ฑ (form.save())
4.
์ฑ๊ณต ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์
ํ์ฅ ํ
๊ธฐ๋ฅ | ๋ฐฉ๋ฒ |
๋ก๊ทธ์ธ ํ ์๋ ๋ก๊ทธ์ธ | login(request, user) ์ฌ์ฉ |
์ค๋ณต ์ด๋ฉ์ผ ๊ฒ์ฆ | clean_email() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ |
์ถ๊ฐ ํ๋ (์: ์๋
์์ผ) | Custom User ๋ชจ๋ธ ์ฌ์ฉ ๋๋ UserProfile ์ฐ๊ฒฐ |
์ค์ต ์์ด๋์ด
โข
์ด๋ฉ์ผ ์ค๋ณต ์ฒดํฌ ์ถ๊ฐ
โข
๊ฐ์
ํ ํ์ ์ด๋ฉ์ผ ๋ฐ์ก
โข
๊ฐ์
์ฑ๊ณต ์ ์๋ ๋ก๊ทธ์ธ
โข
๊ฐ์
์ ์ฝ๊ด ๋์ ์ฒดํฌ๋ฐ์ค ์ถ๊ฐ