리셋 되지 말자

[CSAPI] Django 회원가입 구현 본문

프로젝트

[CSAPI] Django 회원가입 구현

kyeongjun-dev 2021. 10. 5. 15:47

Django 의 model

회원가입 기능 구현을 하기 전에, 잠시 복기

auth app의 기본 model

- mariadb 의 auth_user 테이블 확인

+----+-----------+----------------------------+--------------+----------+------------+-----------+---------------------+----------+-----------+----------------------------+     
| id | password  | last_login                 | is_superuser | username | first_name | last_name | email               | is_staff | is_active | date_joined                |     
+----+-----------+----------------------------+--------------+----------+------------+-----------+---------------------+----------+-----------+----------------------------+

usercreationform : 링크

modelform : 링크

 

signup 구현

회원가입도 django.contrib.auth 앱을 통해 구현한다.

templates/csapi/main.html 수정 - 로그인한 상태가 아닌 경우, 회원가입 링크가 보이도록 수정한다.

{% block content %}
<html>
    <head>
    </head>
    <body>
        {% if user.is_authenticated %}
            <a href="{% url 'login:logout' %}">{{ user.username }} (Logout)</a>
        {% else %}
            <a href="{% url 'login:login' %}">Sign In</a>
            <a href="{% url 'login:signup' %}">Sign Up</a>
        {% endif %}
    </body>
</html>
{% endblock %}

 

login/urls.py 수정 - signup url 로 요청이 오면 views.py 의 signup 을 호출하도록 수정한다

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

app_name = 'login'

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

 

login/views.py 수정 - signup 함수를 추가한다

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse('login 페이지입니다')

def signup(request):
    return HttpResponse('회원가입 동작 확인')

 

중간 테스트

 Sign Up 링크 생성 확인
Sign Up 클릭 시, 이동 확인

 

login/forms.py 작성 - username, password1, password2 속성을 갖는 UserCreationForm 에 email 필드를 추가하기 위해 UserCreationForm 을 상속시켜 확장

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") # add email field

 

login/views.py 의 signup 함수 수정 - login에 성공하면 main 페이지로 redirect

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from login.forms import UserForm

def index(request):
    return HttpResponse('login 페이지입니다')

def signup(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            password1 = form.cleaned_data.get('password1')

            # user authentication
            user = authenticate(username=username, password=password1)

            # login
            login(request, user)
            return redirect('/')
    else:
        form = UserForm()
    return render(request, 'login/signup.html', {'form' : form})

 

templates/login/signup.html 작성

{% block content %}
<html>
    <head>
    </head>

    <body>
        <h1>회원가입 페이지</h1><br>
        <div>
            <form method="post" action="{% url 'login:signup' %}">
                {% csrf_token %}

                {% if form.errors %}
                    {% for field in form %}
                        {% for error in field.errors %}  <!-- field error -->
                            <strong>{{ field.label }}</strong>
                            {{ error }}
                        {% endfor %}
                    {% endfor %}
                    {% for error in form.non_field_errors %}   <!-- None field error -->
                        <strong>{{ error }}</strong>
                    {% endfor %}
                {% endif %}

                <h4>이름 : </h4>
                <input type="text" name="username" value="{{ form.username.value|default_if_none:'' }}">
                <h4>비밀번호 : </h4>
                <input type="password" name="password1" value="{{ form.password1.value|default_if_none:'' }}">
                <h4>비밀번호 확인 : </h4>
                <input type="password" name="password2" value="{{ form.password2.value|default_if_none:'' }}">
                <h4>이메일 : </h4>
                <input type="email" name="email" value="{{ form.email.value|default_if_none:'' }}">

                <button type="submit">제출</button>
            </form>
        </div>
    </body>
</html>

{% endblock %}

 

signup 테스트

정보 입력
제출 후, 가입과 동시에 login 성공

 

database 서버의 DB 데이터 확인

 

'프로젝트' 카테고리의 다른 글

[CSAPI] Django Origin Image 모델 추가  (0) 2021.10.05
[CSAPI] Django DB 스키마 설계  (0) 2021.10.05
[CSAPI] Django login, logout 구현  (0) 2021.10.05
[CSAPI] Django login app 생성  (0) 2021.10.04
[CSAPI] Django csapi app 생성  (0) 2021.10.04
Comments