여름의 서재

[Django] Auth 정복하기(1)_Signup (회원가입) 본문

Skill/Django

[Django] Auth 정복하기(1)_Signup (회원가입)

엉아_ 2021. 9. 26. 16:54
728x90

📄 유저 시나리오

1. 회원가입 버튼을 누른다.

2. 회원가입 폼이 담긴 페이지가 나온다.

3. 회원가입 폼을 작성하여 제출 버튼을 누른다.

4. 회원가입이 정상적으로 완료되면 바로 로그인이 되고 메인페이지가 나온다.

 

🔨 기능 구현하기

1) urls 

: accounts 앱에 signup이라는 이름의 주소 생성

from django.urls import path
from . import views

app_name = 'accounts'
urlpatterns = [
    path('signup/', views.signup, name='signup'),
]

 

 

2) views

 

  • GET: 회원가입 폼이 담긴 페이지를 응답
  • POST: 회원가입 정보를 받아서 "유효성 검사" 후 회원가입 진행
    • 유효성 검사를 통과하지 못한 경우 에러 메세지를 담아서 출력

(단, 로그인이 된 상태에서 signup 함수를 실행하려한다면 바로 메인페이지로 이동)

from django.shortcuts import redirect, render
from django.contrib.auth import login as auth_login
from django.contrib.auth.forms import UserCreationForm

def signup(request):
    if request.user.is_authenticated:
        return redirect('articles:index')

    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('articles:index')
    else:
        form = UserCreationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/signup.html', context)

 

request.user.is_authenticated

: 사용자가 인증되었는지 확인하는 함수.
User에 항상 True이며, AnonymousUser에 대해서만 항상 False.

 

UserCreationForm

: 새로운 유저를 생성해주는 내장 폼

 

auth_login (원래 login)

: 유저 정보를 세션에 생성 및 저장하는 역할을 하는 Django 내장 함수

 

 

3) templates

: 회원가입 폼이 담긴 페이지

{% extends 'base.html' %}

{% block content %}
  <h1>Signup</h1>
  <form action="{% url 'accounts:signup' %}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
  </form>
{% endblock content %}

 

 

* 만약 UsercreationFrom을 수정하고 싶다면!

 

4) forms

from django.contrib.auth.forms import UserCreationForm, UserChangeForm

# User 모델을 불러오는 2가지 방법 
from django.contrib.auth.models import User # Django 내장 User 모델
from django.conf import settings # => settings.AUTH_USER_MODEL


class CustomUserCreationForm(UserCreationForm):

    class Meta:
        model = User
        # fields = ('username', 'password1', 'password2', 'email')
        fields = UserCreationForm.Meta.fields + ('email',)

 

Comments