상세 컨텐츠

본문 제목

[Django] 회원가입

Python/Django

by TUZA 2022. 9. 25. 23:18

본문

#회원가입 링크

navbar.html

<div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <li class="nav-item">
            {% if user.is_authenticated %}
            <a class="nav-link" href="{% url 'common:loginout' %}">{{user.username}} (로그아웃)</a>
            {% else %}
            <a class="nav-link" href="{% url 'common:login' %}">로그인</a>
            {% endif%}
        </li>
        <li>
            {% if not user.is_authenticated %}
            <a  class="nav-link" href="{% url 'common:signup' %}">회원가입
            </a>
            {% endif %}
        </li>
    </ul>
</div>

 

#urls.py

#navbar.html 에서 {% url 'common:signup' %} 태그를 추가했으므로 여기에 대응하는 url 매핑 규칙을 추가해야한다.
#common/urls.py 파일에 회원가입을 위한 URL 매핑 규칙을 추가하자.

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = 'common'

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name = 'common/login.html'), name = 'login'),
    path('loginout/', auth_views.LogoutView.as_view(), name= 'loginout'),
    path('signup/', views.signup, name='signup'),

]

#forms.py

뷰 함수를 만들기 전에 계정생성 시 필요한 UserForm 을 common/fomrs.py 파일에 작성하자.

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


class UserForm(UserCreationForm):
    email = forms.EmailField(label="이메일")

    class Meta:
        model = User
        fields = ("username", "password1", "password2", "email")
        
        
'''
UserForm은 django.contrib.auth.forms 모듈의 UserCreationForm 클래스를 상속하여 만들었다.
그리고 email 속성을 추가했다. UserForm 을 따로 만들지 않고 UserCreationForm 을 그대로 사용해도 되지만
위처럼 이메일 등의 속성을 추가하기 위해서는 UserCreationForm 클래스를 상속하여 만들어야한다.
UserCreationForm의 is_valid 함수는 폼에 위의 속성 3개가 모두 입력되었는지,
비밀번호1과 비밀번호2가 같은지, 
비밀번호의 값이 비밀번호 생성 규칙에 맞는지 등을 검사하는 로직을 내부적으로 가지고 있다.
'''

 

#views.py

#common/views.py
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from common.forms import UserForm
# Create your views here.

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, 'common/signup.html', {'form': form})

signup 함수는 POST 요청인 경우에는 화면에서 입력한 데이터로 사용자를 생성하고 GET 요청인 경우에는 회원가입 화면을 보여준다.

form.cleaned_data.get 함수는 폼의 입력값을 개별적으로 얻고 싶은 경우에 사용하는 함수이다.

여기서는 인증 시 사용자명과 비밀번호를 얻기 위해 사용했다.

그리고 신규 사용자를 생성한 후 자동 로그인이 될 수 있도록 authenticaate 와 login 함수가 사용되었다.

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

 

#signup.html

{% extends "base.html" %}
{% block content %}
<div class="container my-3">
    <form method="post" action="{% url 'common:signup' %}">
        {% csrf_token %}
        {% include "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 %}

 

 

반응형

'Python > Django' 카테고리의 다른 글

[Django] 모델 변경하기  (0) 2022.09.28
[Django] 로그인과 로그아웃(작성중)  (0) 2022.09.23
[Django] 템플릿 필터 함수  (0) 2022.09.23
[Django] 페이징  (1) 2022.09.22
[Django] 네비게이션바  (1) 2022.09.22

관련글 더보기