23.Django(장고) - ecommerce 프로젝트 - 회원가입

JungSik Heo·2024년 12월 6일
post-thumbnail

1.회원가입

회원가입을 위한 링크를 다음처럼 navbar.html 템플릿에 추가하자.

        <li>
          {% if not user.is_authenticated %}
          <a class="nav-link" href="{% url 'accounts:signup' %}">회원가입</a>
          {% endif %}
        </li>

accounts\urls.py
아래를 추가

   path('signup/', views.signup, name='signup'),

UserForm은 django.contrib.auth.forms 모듈의 UserCreationForm 클래스를 상속하여 만들었다. 그리고 email 속성을 추가했다. UserForm을 따로 만들지 않고 UserCreationForm을 그대로 사용해도 되지만 위처럼 이메일 등의 속성을 추가하기 위해서는 UserCreationForm 클래스를 상속하여 만들어야 한다.

UserCreationForm의 is_valid 함수는 폼에 위의 속성 3개가 모두 입력되었는지, 비밀번호1과 비밀번호2가 같은지, 비밀번호의 값이 비밀번호 생성 규칙에 맞는지 등을 검사하는 로직을 내부적으로 가지고 있다.

views.py

def signup(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)  # 사용자 인증
            login(request, user)  # 로그인
            return redirect('index')
    else:
        form = UserForm()
    return render(request, 'accounts/signup.html', {'form': form})

signup 함수는 POST 요청인 경우에는 화면에서 입력한 데이터로 사용자를 생성하고 GET 요청인 경우에는 회원가입 화면을 보여준다. form.cleaned_data.get 함수는 폼의 입력값을 개별적으로 얻고 싶은 경우에 사용하는 함수로 여기서는 인증시 사용할 사용자명과 비밀번호를 얻기 위해 사용했다. 그리고 신규 사용자를 생성한 후에 자동 로그인 될 수 있도록 authenticate와 login함수가 사용되었다. authenticate와 login함수는 django.contrib.auth 모듈의 함수로 사용자 로그인을 담당한다.

  • django.contrib.auth.authenticate - 사용자 인증을 담당한다. (사용자명과 비밀번호가 정확한지 검증한다.)
  • django.contrib.auth.login - 로그인을 담당한다. (사용자 세션을 생성한다.)

signup.html

templates\accounts\signup.html

{% extends "layout/base.html" %}
{% block content %}
  <div class="container my-3">
    <form method="post" action="{% url 'accounts:signup' %}">
      {% csrf_token %}
      {% include "layout/form_errors.html" %}
      <div class="mb-3">
        <label for="username">사용자 이름</label>
        <input type="text" class="form-control" name="username" id="username" value="{{ form.username.value|default_if_none:'' }}">
      </div>
      <div class="mb-3">
        <label for="password1">비밀번호</label>
        <input type="password" class="form-control" name="password1" id="password1" value="{{ form.password1.value|default_if_none:'' }}">
      </div>
      <div class="mb-3">
        <label for="password2">비밀번호 확인</label>
        <input type="password" class="form-control" name="password2" id="password2" value="{{ form.password2.value|default_if_none:'' }}">
      </div>
      <div class="mb-3">
        <label for="email">이메일</label>
        <input type="text" class="form-control" name="email" id="email" value="{{ form.email.value|default_if_none:'' }}">
      </div>
      <button type="submit" class="btn btn-primary">생성하기</button>
    </form>
  </div>
{% endblock %}

회원가입을 해보자.
비밀번호등 체크를 내부에서 해주는 것을 확인 할수 있다.
위의 규칙을 무시 하기 위하여 아래와 같이 주석 처리 하여 보자.

아래를 주석처리 하여 보자
config\settings.py

AUTH_PASSWORD_VALIDATORS = [
    # {
    #     "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
    # },
    # {
    #     "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
    # },
    # {
    #     "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
    # },
    # {
    #     "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
    # },
]

다시 회원 가입을 하면 유효성 검사를 무시 하고 회원가입이 가능하다.

profile
쿵스보이(얼짱뮤지션)

0개의 댓글