Django 회원가입

Gom La·2023년 4월 20일
0

장고와 친해지기

목록 보기
9/17
post-thumbnail

📌 Django Form

단순 정보 전달성 홈페이지를 만드는 것이 아니라면, 사용자의 입력을 받아야 한다. 사용자의 입력을 받을 수 있는 입력 컨트롤러들을 Form 이라고 한다.
(ex. input, combobox, checkbox, radio 등)

📌 회원가입

회원가입을 진행하기 앞서 Django Form을 이용한 회원가입을 실무에서 잘 사용하지 않는다는 것을 상기하고 가자. 너무 간단하며 모든 것을 Django가 제공하는 것이기 때문에 커스텀할 수 없다는 점에서 실무에서는 잘 사용하지 않는다.

사용자에게 입력 Form을 보여주고 회원가입에 필요한 정보를 받기위해 Django Form을 작성해야한다. Django Form을 작성하면 아래와 같은 과정을 거쳐 회원가입 Form이 구현이 된다.

Form 생성 -> 템플릿으로 전달 -> 템플릿 렌더링

➤ 구현 단계

  1. Django Form 코드 작성
  2. url 라우팅
  3. view 코드 작성
  4. html 코드 작성

➤ Django Form

나는 register 폴더를 생성하여 회원가입 form을 작성할 form.py파일을 생성하였다.

shortener>register>form.py

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

from shortener.models import Users

# This is Form  User register
class RegisterForm(UserCreationForm):
    full_name = forms.CharField(max_length=30, required=False, help_text="Optional..", label="이름")
    username = forms.CharField(max_length=30, required=True, help_text="Required..", label="유저명")
    email = forms.EmailField(max_length=254, help_text="Required. Inform a valid email address.", label="이메일")

    class Meta:
        model = Users
        fields = {
            "username", 
            "full_name",
            "email", 
            # "password",
            # "password_confirm"
            "password1",
            "password2"
        }

코드설명
1. Form을 생성해줄 RegisterForm 클래스 생성
- 생성한 클래스는 유효성체크와 폼을 생성해줄 UserCreationForm를 상속받는다.
2. 사용자에게 입력받게 할 필드 생성
- full_name, username, email
- 단, full_name의 경우 현재 Users모델에 존재하지 않으니 Users 모델에 추가하여 마이그레이션 필요
3. class Meta 생성
- RegisterForm 클래스의 속성을 설정할 Meta 클래스
- model에 회원가입에 사용할 Users 모델
- fields에 입력 시 사용할 필드

주의사항
나는 비밀번호 필드에 1, 2숫자를 붙이기 싫어서 password, password_confirm 이라는 필드로 명명했는데 UserCreationForm을 타고 들어가 보니
UserCreationForm에서 지정된 비밀번호 필드명이 고정되어 있었다.

비밀번호 입력으로 사용할 필드명은 password1, password2로 명명해야한다.

shortener>models.py

class Users(AbstractUser):
    full_name = models.CharField(max_length=30, null=True)
    pay_plan = models.ForeignKey(PayPlan, on_delete=models.DO_NOTHING, null=True)

➤ url 라우팅

from django.urls import path

from shortener.views import get_user, index_view, redirect_view, register

urlpatterns = [
    path('', index_view, name='index'),
    
    # REGISTER
    path('register', register, name='register'),
]

회원가입 요청 시 사용할 url 추가.

➤ view 코드작성

from django.contrib.auth import authenticate, login
from django.shortcuts import render

from shortener.register.form import RegisterForm


def register(request):
    if request.method == "POST":
        form = RegisterForm(request.POST)
        msg = "올바르지 않은 데이터 입니다."

        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)
            msg = "회원가입완료"
        return render(request, "register.html", {"form" : form, "mag" : msg})
    else:
        form = RegisterForm()
        return render(request, "register.html", {"form" : form})

코드설명
1. GET, POST 분기
- 화면이동으로 접속할 HTTP GET 과 회원가입 요청으로 들어올 POST 로 분기
2. 화면이동으로 접속 시 RegisterForm()으로 입력 폼 생성
3. 회원가입 요청 시 RegisterForm() 객체 생성
- 생성한 form객체는 데이터 유효성 검사, 데이터 저장 등의 역할
4. form.is_valid()
- 유효성 체크
5. form.save() 데이터 저장
- 유효성 체크 통과 시 데이터 저장
6. authenticate()
- 인증과 권한 부여를 위한
5. login()
- 로그인 유지

➤ html 코드 작성

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>회원가입</title>
</head>
<body>
    <h2>회원가입</h2>
    <h4>{% if msg %}{{msg}}{% endif %}</h4>
    <form method="post">
        {% csrf_token %} {{ form.as_p }}
        <button type="submit">가입하기</button>
    </form>
</body>
</html>

템플릿 변수와 코드를 사용하여 view에서 전달한 msg와 form을 렌더링 진행

주의사항
Django에서 post 요청 시 csrf_token을 반드시 전달해야한다.

➤ 테스트

회원가입 페이지로 이동 시 Form이 생성해준 입력 칸들이 보여진다.

"가입하기"버튼 클릭 시 view단에서 form.is_valid()함수를 사용하고 있기 때문에 유효성에 대한 코드를 작성하지 않아도 form이 유효성체크를 진행해준다.

유효성에 맞는 입력 값들 입력 후 가입버튼 클릭 후 데이터를 확인하면 Users 테이블에 입력한 데이터가 저장된 것을 확인할 수 있다.

너무나 간단하게 구현했지만 실무에서 사용하는 회원가입은 사실상 더 복잡하고 어렵다. Django가 이렇게 개발자에게 제공하는 것이 있다 정도만 알고 추후 회원 가입에 대한 내용을 더 다루도록 하겠다.

profile
인생 개발자 라곰!!

0개의 댓글