Django form

HTML Form

Form์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ํฐ ํ‹€์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ณ , ์ „์†กํ•œ ๋ฐ์ดํ„ฐ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•ด ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

<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

image-20190419114550264

์žฅ๊ณ ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•œ๊ฐ€์ง€ ์ด๋‹ค. Model ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•˜๊ฒŒ Form ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

Form ํด๋ž˜์Šค๋Š” Django Form ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.



์„ค๋ช…

form.is_valid()

ํผ์˜ ์ž…๋ ฅ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ

form.is_bound

์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธ

form.data

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํผ ๋ฐ์ดํ„ฐ

form.cleaned_data

๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ํผ ๋ฐ์ดํ„ฐ

form.as_p()

<p></p> ํƒœ๊ทธ๋กœ ํผ ์ถœ๋ ฅ

form.as_ul()

<ul></ul> ํƒœ๊ทธ๋กœ ํผ ์ถœ๋ ฅ

form.as_table()

<table></table> ํƒœ๊ทธ๋กœ ํผ ์ถœ๋ ฅ

  1. ์ž…๋ ฅ ํผ ์ƒ์„ฑ : as_table() ,as_p(), as_ul() ๊ธฐ๋ณธ์ œ๊ณต

  2. ์œ ํšจ์„ฑ ๊ฒ€์ฆ(Validation)

  3. ๊ฒ€์ฆ์— ํ†ต๊ณผํ•œ ๊ฐ’์„ dictionary type์œผ๋กœ ์ œ๊ณต(cleaned_data)

Form vs Model Form

# 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 ๋กœ ์˜ˆ์™ธ๋ฐœ์ƒ ์œ ๋ฌด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  1. ํ•ด๋‹น ํ•„๋“œ์˜ clean_<fieldname>() ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ฒ€์ฆ๋œ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ณ์ง€ ์•Š์€๊ฒฝ์šฐ ValidationError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

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์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

# 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

ํ•จ์ˆ˜ํ˜•๋ทฐ

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

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

{% 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 %}

์ฐธ์กฐ

Last updated

Was this helpful?