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 ๊ด๋ฆฌ ์์คํ
์ ํต์ฌ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค.
์
๋ ฅ ํผ ์์ฑ : 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 %}
์ฐธ์กฐ