Django로 웹 개발하기 - 3. 회원가입(user 모델 만들기)
이 글은 fast_campus의 파이썬 웹 개발 수업을 듣고 정리, 추가한 내용으로 Django의 AbstractUser를 사용하여 user모델을 확장하고 회원가입 모델링 하는 과정을 살펴보겠다.
회원가입 기능 만들기
- users app 생성, settings.py 의 INSTALLED_APPS 에 ‘users’ 추가
- models.py 에 User class 모델 만들기
- models.py 에 create_user, create_superuser 함수를 UserManager class를 만들어 관리
- forms.py 에 RegisterForm class 를 만들어 회원가입 기능 만들기
- views.py 에 request를 인자로 하는 register 함수를 만들어 받아온 request 값을 RegisterForm으로 넘겨준다.
- 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 확장하는 방법은..?
- proxy model(프록시 모델 사용하기)
- 하나의 모델을 정의 후, User모델과 One-to-One(일대일) 관계 형성
- AbstractBaseUser
- AbstractUser
AbstractUser를 사용하여 user Model을 아래 코드와 같이 확장 시킬 수 있다.
from django.db import models
from django.contrib.auth.models import AbstractUser
class FCUser(AbstractUser):
...
Leave a comment