장고(Django) 핥짝 맛보기 - 사용자 인증을 참고

  • 회원가입에 대한 view를 CreateView를 만들자.
  • model : 폼을 생성할 때 이 변수에 지정한 모델을 참조하고, 폼 필드들은 이 모델 필드의 속성을 참조한다.
  • fields : model이 정의되면 자동으로 폼 객체를 생성하는 데, 이때 폼의 필드는 이 클래스변수에 정의되어 있는 필드만 사용한다. 단, 장고에서 기본으로 생성되는 모델 폼을 사용할 경우에만 필요하다.
  • template_name : 렌더링할 템플릿 경로
# user/views.py
from . models import User
from django.views import generic

class UserRegister(generic.CreateView):
    model = User
    fields = ['username', 'email', 'password']
    template_name = 'user/join.html'
  • 하지만 이 상태로 템플릿에 {{ form.as_p }} (또는 as_table, as_ul)를 사용할 때 비밀번호 필드는 그대로 input=”text”로 나타나버린다.
  • auth 프레임워크에서 제공하는 UserCreationForm을 사용해보자.
  • model 변수에 User 모델을 지정하지 않고 유연한 방법으로 지정해보자.
  • forms.py에 UserCreationForm을 상속받은 새로운 폼을 작성한다.
  • model 변수의 get_user_model() : 프로젝트 폴더의 settings.py의 AUTH_USER_MODEL이 참조하는 모델을 찾아주는 함수
  • fields : 정의된 모델에서 폼에 보여줄 필드를 정의한다. password는 UserCreationForm에서 자동 생성된다.
# user/forms.py
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    class Meta:
        model = get_user_model()
        fields = ['username', 'email']
  • view에서 새로 만든 폼을 사용하도록 변경한다.
  • view에서도 마찬가지로 get_user_model() 함수를 model 변수에 지정한다.
from django.views import generic
from user.forms import UserRegisterForm
from django.contrib.auth import get_user_model

class UserRegister(generic.CreateView):
    model = get_user_model()
    form_class = UserRegisterForm
    template_name = 'user/join.html'
    success_url = '/board/'
  • 템플릿에 {{ form.as_p }} (또는 as_table, as_ul)로 호출 시 UserCreationFrom이 상속받는 ModelForm의 help_text도 함께 보이기 때문에 form을 for문으로 출력한다.
  • 유효성을 통과하지 못할 때마다 errors 변수에 오류 내용이 추가된다. 에러 메시지도 나타내도록 한다.
<form method="post" action="{% url 'user:join' %}">
    {% csrf_token %}
    {% for field in form %}
    <div class="form-group">
        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
        <input type="{{ field.field.widget.input_type }}"
                class="form-control {% if field.errors|length > 0 %}is-invalid{% endif %}"
                id="{{ field.id_for_label }}"
                name="{{ field.html_name }}"
                value="{{ field.value|default_if_none:'' }}">
        {% for error in field.errors %}
            <div class="invalid-feedback">{{ error }}</div>
        {% endfor %}
    </div>
    {% endfor %}
    <button type="submit" class="btn btn-primary btn-lg btn-block">가입</button>
</form>
  • UserCreationForm으로 자동 생성되는 필드는 레이블 값이 영어로 나타난다.
  • settings.py의 LANGUAGE_CODE를 변경하면 장고에서 미리 번역해둔 문자열들로 치환된다.
# conf/settings.py

LANGUAGE_CODE = 'ko-KR'
TIME_ZONE = 'Asia/Seoul'