Django로 웹 개발하기 - 3. 회원가입(user 모델 만들기)

2 minute read

이 글은 fast_campus의 파이썬 웹 개발 수업을 듣고 정리, 추가한 내용으로 Django의 AbstractUser를 사용하여 user모델을 확장하고 회원가입 모델링 하는 과정을 살펴보겠다.

회원가입 기능 만들기

  1. users app 생성, settings.py 의 INSTALLED_APPS 에 ‘users’ 추가
  2. models.py 에 User class 모델 만들기
  3. models.py 에 create_user, create_superuser 함수를 UserManager class를 만들어 관리
  4. forms.py 에 RegisterForm class 를 만들어 회원가입 기능 만들기
  5. views.py 에 request를 인자로 하는 register 함수를 만들어 받아온 request 값을 RegisterForm으로 넘겨준다.
  6. urls.py 에 연결해준다.

User 모델 만들기

1. 앱 만들기

  • users 앱 만들기 python manage.py startapp users

  • 앱을 만들고 나면 settings.py 의 INSTALLED_APPS 에 앱을 추가

    INSTALLED_APPS += [
      'users',
    ]
    

2. user model 만들기

  • models.py 에 User 모델을 만들기

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
       email = models.EmailField(verbose_name='email', )
       username = models.CharField
       gender = models.SmallIntegerField
       objects = UserManager()
    
       USERNAME_FIELD = 'email'  # email 로 로그인
       REQUIRED_FIELDS = [] # 필수로 받고 싶은 필드들 넣기 원래 소스 코드엔 email필드가 들어가지만 우리는 로그인을 이메일로
    
       def __str__(self):
           return "<% %>" % (self.~, self.~)
    
  • AbstractUser 에 대한 설명은 아래에서 다시 하도록 하겠다.

3. models.py 에 create_user, create_superuser 함수 만들기

  • UserManager class로 create_user, create_superuser 함수 관리

    from django.contrib.auth.models import AbstractUser, BaseUserManager  #BaseUserManager 추가
    
    class UserManager(BaseUserManager):
       def _create_user(self, email, username, password, gender=2, **extra_fields):
           ...
           return user
    
       def create_user(self, email, username='', password=None, **extra_fields):
           ...
           return self._create_user(email, username, password, **extra_fields)
    
       def create_superuser(self, email, password, **extra_fields):
           ...
           return self._create_user(email, '~~.html',  password, **extra_fields)
    

4. 데이터 베이스 적용하기

  • makemigrations 명령어를 사용해서 모델의 변경사항을 기록 : python manage.py makemigrations users

  • 기록한 변경사항을 데이터베이스에 적용을 위해 migrate 명령어 사용 : python manage.py migrate

  • AbstractUser을 쓰면 model에 이력이 잘못 남겨질 수 있음 (Django의 고질적 문제) : rm db.sqlite3 으로 db를 먼저 날려주고 하면 됨

  • User 모델을 커스터마이징 했을 때 발생하는 에러가 있는경우 settings.py 에 다음을 추가해준다.

    AUTH_USER_MODEL = 'users.User'
    

5. 관리자 사이트 admin.py 에 user등록하기

from .models import User

admin.site.register(User)

6. forms.py 에 RegisterForm class 만들기

# 장고에서는 HTML 입력요소를 widget(위젯)이라고 말한다.
from django import forms
from .models import User

class RegisterForm(forms.ModelForm):
    password = forms.CharField(label='password', widget=forms.PasswordInput)
    confirm_password = forms.CharField(label='confirm password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'gender', 'email']

    def clean_confirm_password(self):
    # clean메써드가 호출된후에 호출되는 메써드 clean_필드네임(유효성 검사) ex)clean_username
        ...

7. views.py 에 request를 인자로 하는 register 함수 만들기

  • register 함수를 이용해 받아온 request 값을 RegisterForm으로 넘겨준다.
from django.shortcuts import render
from .forms import RegisterForm

def register(request):
    if request.method == 'POST':
        user_form = RegisterForm(request.POST)
        if user_form.is_valid():
            ...
            return render(...)
    else:
        user_form = RegisterForm()

    return render(...)

8. urls.py 에 연결

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('users.urls')),

users\urls.py

from django.urls import path
from .views import register

urlpatterns = [
    path('register/', register, name='register'),
]

User 모델 확장

  • 이전까지 장고 내장 User 모델을 잘 사용해왔는데 User 모델을 왜 확장 해야하나??

    • Django의 내장 User모델이 제공하는 필드 외에 다른 필드, 등을 추가하고 싶을 때를 위해서
    • 내 입맛대로 User모델 커스텀하기 위해서
  • 그렇다면 User Model 확장하는 방법은..?

    1. proxy model(프록시 모델 사용하기)
    2. 하나의 모델을 정의 후, User모델과 One-to-One(일대일) 관계 형성
    3. AbstractBaseUser
    4. AbstractUser

AbstractUser를 사용하여 user Model을 아래 코드와 같이 확장 시킬 수 있다.

from django.db import models
from django.contrib.auth.models import AbstractUser

class FCUser(AbstractUser):
	...

Leave a comment