1. django form 서론

django 에서는 form 이라는 편리한 도구를 제공합니다. models.py에서 작성한 모델을 바탕으로 템플릿 파일에서 models.py의 model에 맞게 폼을 형성해주는 것입니다. 물론 django에서 제공하기에 views.py에서도 연동하여 이용할 수 있습니다. 여러가지 귀찮은 검사를 django에게 맡길 수 있습니다. 그리고 복잡한 html 코드를 단순하게 줄여줍니다.


django form documentation : https://docs.djangoproject.com/en/2.0/topics/forms/


2. django form 유무에 따른 html 코드 비교 

먼저 form을 사용하지 않았을 때의 html 코드입니다.

<form action="." method="post">
    {% csrf_token %}
    <div>
        <label for="name">username:</label>
        <input type="text" id="name" />
    </div>
    <div>
        <label for="mail">E-mail:</label>
        <input type="email" id="mail" />
    </div>
    <div>
        <label for="password">password:</label>
        <textarea id="password"></textarea>
    </div>
     <div>    
        <label for="password_confirm">password_confirm:</label>
        <textarea id="password_confirm"></textarea>
    </div>
    <div class="button">
        <button type="submit">Submit</button>
    </div>
</form>
cs


하나의 입력 폼을 작성할 때 두 줄의 코드를 필요로 하게 됩니다.


이번엔 form을 사용했을 때의 코드입니다.


<form class="form-horizontal" method="post" action=".">
 
  {% csrf_token %}
 
 
  <div class="form-group">
    <label class="control-label col-sm-2" for="id_username">Username(ID)</label>
    <div class="col-sm-10">{{ form.username }}</div>
  </div>
  <div class="form-group">
    <label class="control-label col-sm-2" for="id_email">Email</label>
    <div class="col-sm-10">
      {{ form.email }}
    </div>
  </div>
  <div class="form-group">
    <label class="control-label col-xs-2 col-sm-2" for="id_password">Password</label>
    <div class="col-sm-10">
      {{ form.password }}
    </div>
  </div>
  <div class="form-group">
    <label class="control-label col-xs-2 col-sm-2" for="id_password_confirm">Password</label>
    <div class="col-sm-10">
      {{ form.password_confirm }}
    </div>
  </div>
 
  <div class="form-group">
    <div class="col-xs-offset-5 col-sm-offset-5">
      <button class="btn btn-default" type="submit">Create</button>
    </div>
  </div>
</form>
cs


얼핏 보면 더 코드가 증가한 것 같지만 부트스트랩을 이용하기 위해 들어간 코드들을 제외하면 훨씬 더 간결해졌음을 알 수 있습니다.

특히 하나의 입력 폼이 {{ form.email }} 처럼 짧아지게 됩니다. 코드의 재사용시에도 {{ form.email }} 같이 짧게 이용할 수 있으니 효율적입니다.


3. models.py

form을 적용할 모델을 정하겠습니다. 위의 form은 기본 User모델을 참고로 만들었으므로 User모델을 확인해보겠습니다.

class User(AbstractUser):
cs


이러므로 이번엔 AbstractUser를 살펴보겠습니다.


class AbstractUser(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
    )
    email = models.EmailField(_('email address'), blank=True)
cs


AbstractBaseUser 까지 살펴보면 이렇습니다.


@python_2_unicode_compatible
class AbstractBaseUser(models.Model):
    password = models.CharField(_('password'), max_length=128)
cs


결국 username과 email, password 까지 위에서 사용된 모든 필드를 찾을 수 있었습니다. 

이 필드들이 바탕이 되어 forms.py에서 형성되게 됩니다. 각각 CharField와 EmailField가 사용되었습니다.


4. forms.py

forms.py 에서는 사용할 모델을 가져오거나 django 의 form 을 가져와줘야 합니다.

from django import forms
from django.contrib.auth.models import User
cs

그 다음에 필요한 폼을 작성하시면 됩니다.


class UserCreateForm(forms.ModelForm):
    username = forms.CharField(widget=forms.TextInput(attrs={'class''form-control ''placeholder''Username'}))
    email = forms.EmailField(widget=forms.EmailInput(attrs={'class''form-control''placeholder''email'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class''form-control''placeholder''Password'}))
    password_confirm = forms.CharField(widget=forms.PasswordInput(attrs={'class''form-control',
                                                                         'placeholder''Password_confirm'}))
 
    class Meta:
        model = User
        fields = ['username''email''password']
 
cs


이렇게 작성했습니다. 위에서 언급한 것처럼 CharField와 EmailField가 그대로 사용되었습니다. widget은 html에서 어떤 입력창을 사용하는지를 결정합니다. 그 옆에 괄호 안의 'class', 'placeholder'는 그대로 html에서 반영되는 요소들입니다. 원하는대로 적용해주세요. 저는 부트스트랩을 이용중이니 'class'에 'form-control'을 추가해줬습니다.


4. views.py


views.py의 def create(request): 에서 이 form을 사용한다고 해 봅시다. 그렇게 되면 얼마나 편리한지 알 수 있게 됩니다.


def create(request):
    if request.method == 'POST':
 
        form = UserCreateForm(request.POST)
 
        username = form.data['username']
        email = form.data['email']
        password = form.data['password']
        password_confirm = form.data['password_confirm']
        if form.is_valid:
            pass
    else:
        form = UserCreateForm()
        return render(request, 'create.html', {'form': form})
cs


이게 다입니다. 폼은 request와 함께 views.py로 전송되는데 그 폼을 읽기 위해서 단지 form = UserCreateForm(request.POST) 이 한 줄이 필요합니다. 그 다음엔 form.is_valid 같은 유효성 검사도 django에서 다 지원해주니 원하시는 대로 사용하시면 됩니다.



+ Recent posts