HTML Form
Form์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ํฐ ํ์ ๋ง๋๋๋ฐ ์ฌ์ฉ๋๋ค. ์
๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์๋ฒ๋ก ์ ์กํ๊ณ , ์ ์กํ ๋ฐ์ดํฐ๋ ์น ์๋ฒ๊ฐ ์ฒ๋ฆฌํด ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋ค.
Copy <form action = "#" accept-charset="utf-8" name = "" method = "get">
...
</form>
action
: form ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ URL์ ์ง์ ํ๋ค.
enctype
: ํ์ผ์ ๋๊ธธ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
method
: form์ ์๋ฒ๋ก ์ ์กํ๋ http ๋ฐฉ์์ ์ง์ ํ๋ค. (GET/POST)
name
: form์ ์๋ณํ ์ด๋ฆ ์ง์
target
: action์์ ์ง์ ํ ์คํฌ๋ฆฝํธ ํ์ผ์ด ํ์ฌ๋ ๋ค๋ฅธ ์์น์์ ์ด๋ฆฌ๋๋ก ํ๋ค.
accept-charset
: form ์ ์ก์ ์ฌ์ฉํ ๋ฌธ์ ์ธ์ฝ๋ฉ ์ง์
Django Form
์ฅ๊ณ ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๊ฐ์ง ์ด๋ค. Model ํด๋์ค์ ์ ์ฌํ๊ฒ Form ํด๋์ค ๋ฅผ ์ ์ํ๋ค.
Form
ํด๋์ค๋ Django Form ๊ด๋ฆฌ ์์คํ
์ ํต์ฌ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค.
ํผ์ ์
๋ ฅ๊ฐ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ด ์๋์ง ํ์ธ
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ํผ ๋ฐ์ดํฐ
๊ฒ์ฌ๋ฅผ ํต๊ณผํ ํผ ๋ฐ์ดํฐ
<p></p>
ํ๊ทธ๋ก ํผ ์ถ๋ ฅ
<ul></ul>
ํ๊ทธ๋ก ํผ ์ถ๋ ฅ
<table></table>
ํ๊ทธ๋ก ํผ ์ถ๋ ฅ
์
๋ ฅ ํผ ์์ฑ : as_table()
,as_p()
, as_ul()
๊ธฐ๋ณธ์ ๊ณต
์ ํจ์ฑ ๊ฒ์ฆ(Validation )
๊ฒ์ฆ์ ํต๊ณผํ ๊ฐ์ dictionary type
์ผ๋ก ์ ๊ณต(cleaned_data
)
Form vs Model Form
Copy # app/forms.py
from django import forms
from .models import Post
# Form (์ผ๋ฐ ํผ)
class PostForm(forms.Form):
title = forms.CharField()
content = forms.CharField(widget=forms.Textarea)
# Model Form (๋ชจ๋ธ ํผ)
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
Form : ์ง์ ํ๋ ์ ์, ์์ ฏ ์ค์ ์ด ํ์ํ๋ค
Model Form : ๋ชจ๋ธ๊ณผ ํ๋๋ฅผ ์ง์ ํ๋ฉด ๋ชจ๋ธํผ์ด ์๋์ผ๋ก field๋ฅผ ์์ฑํ๋ค.
class Meta
๋ ํผ์ ๋ง๋ค๊ธฐ ์ํด์ ์ด๋ค ๋ชจ๋ธ์ด ์ฐ์ฌ์ผํ๋์ง ์ฅ๊ณ ์ ์๋ ค์ฃผ๋ ๊ตฌ๋ฌธ์ด๋ค.
Form fields๋ HTML Form Fields๋ฅผ ํ์ด์ฌ ํด๋์คํ ํ๊ฒ์ด๋ค.
Validation ์ํจ์ฑ ๊ฒ์ฌ
๊ธฐ๋ณธ์ ์ธ ์ ํจ์ฑ ๊ฒ์ฌ๋ ๊ฐ์ ์ ๋ฌด์ด๋ค. forms.ValidationError
๋ก ์์ธ๋ฐ์ ์ ๋ฌด๋ฅผ ์ฒ๋ฆฌํ๋ค.
ํด๋น ํ๋์ clean_<fieldname>()
๋ฉ์๋๋ฅผ ์ถ๊ฐํด ๊ฒ์ฆ๋ ์
๋ ฅ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์ณ์ง ์์๊ฒฝ์ฐ ValidationError๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
Copy from django import forms
from django.core.exceptions import ValidationError
class PostForm(forms.Form):
title = forms.CharField()
def clean_title(self):
title = self.cleaned_data['title']
if(len(title) < 10):
raise ValidationError(_('์ ๋ชฉ์ ๊ธธ์ด๊ฐ ๋๋ฌด ์งง์ต๋๋ค. 10๊ธ์์ด์ ์
๋ ฅํด์ฃผ์ธ์.'))
return title
_()
์ฌ๊ธฐ์ _
๋ gettext()
, gettext_lazy()
์ด๋ค.
https://docs.djangoproject.com/en/2.2/topics/i18n/translation/
validators๋ form๋ณด๋ค Model์ ์ ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
Copy # app/models.py
from django import forms
from django.db import models
# validation
def min_length_validator(value):
if len(value)<3:
raise forms.ValidationError('๊ธ์์๊ฐ ๋๋ฌด ์งง์ต๋๋ค. 3๊ธ์ ์ด์ ์
๋ ฅํด์ฃผ์ธ์.')
# Create your models here.
class Marketing(models.Model):
title = models.CharField(max_length=200, validators=[min_length_validator])
str_date = models.DateTimeField()
end_date = models.DateTimeField()
ins_name = models.CharField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True) # ํด๋น ๋ ์ฝ๋ ์์ฑ์ ํ์ฌ ์๊ฐ ์๋์ ์ฅ
mod_name = models.CharField(max_length=20)
updated_at = models.DateTimeField(auto_now=True) # ํด๋น ๋ ์ฝ๋ ์์ฑ์ ์์ ์๊ฐ ์๋์ ์ฅ
def __str__(self):
return '%s' % (self.title)
๊ณต์๋ฌธ์ ์์ ๋ ์์ธํ ์ดํด๋ณผ ์ ์๋ค.
View
ํจ์ํ๋ทฐ
Copy def post_new(request):
if request.method == 'POST':
form = MarketingForm(request.POST,request.FILES)
# form์ ๋ชจ๋ validators ์ ํจ์ฑ ๊ฒ์ฆ ์ํ, ๊ฒ์ฆ ์ฑ๊ณตํ ๊ฐ์ dictionary type์ผ๋ก ์ ๊ณต(form.cleaned_data)
# ๊ฒ์ฆ์คํจ์ form.error์ ์ค๋ฅ ์ ๋ณด ์ ์ฅ
if form.is_valide():
mrkt = form.save()
return redirect(mrkt)
else:
form = MarketingForm()
return render(request, 'toast_grid/new.html', {'form': form,})
class IndexView(generic.TemplateView):
template_name = "index.html"
FormView
Copy from django.shortcuts import render
from django.views import generic
from django.urls import reverse
from .models import Marketing
from .forms import MarketingForm
class FormView(generic.edit.FormView):
form_class = MarketingForm #forms.py์์ ์ง์ ํ MarketingForm
template_name = 'toast_grid/new.html' # Template
def get_success_url(self):
return reverse('admin:index')
def form_valid(self, form):
form.save()
return super().form_valid(form)
Template
Copy {% extends "base.html" %}
{% load static %}
{% block content %}
<h1>New Page</h1>
<form action="" method="post">
{% csrf_token %}
{{ form.as_table }}
<input type="submit">
</form>
{% endblock content %}
์ฐธ์กฐ