현재 공모전 준비를 위해서 django을 사용해서 백엔드 개발을 진행중임
간단하게 진행했던 지난 프로젝트와는 달리 상용화를 염두해두고 있어서, user model에 필요한 정보가 많음
이에 custom user model을 새로 만들어야할 필요성을 느낌
현재 dj_rest_auth를 사용하여 social account를 연결한 상태임
수정 및 추가로 필요한 모듈은 총 5개로 아래와 같음
- models.py
- serializers.py
- adapters.py
- admin.py
- settings.py
1. models.py
dj_rest_auth는 default로 설정된 user model 존재함
해당 user model를 사용해서 registration을 진행할 경우, username, password1, password2, email 필드를 요청함
내가 추가적으로 필요한 필드는 phone number, address, nickname이므로 user model를 새로 정의함
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True, null=True)
address = models.CharField(max_length=255, blank=True, null=True)
nickname = models.CharField(max_length=10, blank=True, null=True)
# 디버깅용
def __str__(self):
return self.username2. serializers.py
dj_rest_auth는 RegisterSerializer를 사용해서 입력된 값을 저장함
변경한 user model에 맞는 serializer를 새로 만듦
from dj_rest_auth.registration.serializers import RegisterSerializer
from rest_framework import serializers
class CustomRegisterSerializer(RegisterSerializer):
phone_number = serializers.CharField(
required=True,
help_text="휴대폰 번호 형식: 010-1234-5678")
address = serializers.CharField(max_length=255, required=True)
nickname = serializers.CharField(max_length=10, required=False)
def get_cleaned_data(self):
data = super().get_cleaned_data()
data['phone_number'] = self.validated_data.get('phone_number', '')
data['address'] = self.validated_data.get('address', '')
data['nickname'] = self.validated_data.get('nickname', '')
return data
def save(self, request):
user = super().save(request)
phone_number = self.validated_data.get('phone_number')
address = self.validated_data.get('address')
nickname = self.validated_data.get('nickname')
user.phone_number = phone_number
user.address = address
user.nickename = nickname
user.save()
return user3. adapters.py
이번에 custom user model를 만들면서 알게 된 모듈임
CustomRegisterSerializer를 사용하면 register form은 변경되지만, 입력된 값이 db에 저장되지 않음
추가 필드를 db에 저장하기 위해서 다음과 같이 adapters.py를 새로 만듦
from allauth.account.adapter import DefaultAccountAdapter
# 추가필드 저장
class CustomUserAccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=True):
from allauth.account.utils import user_field
user = super().save_user(request, user, form, False)
user_field(user, 'phone_number', request.data.get('phone_number'))
user_field(user, 'address', request.data.get('address'))
user_field(user, 'nickname', request.data.get('nickname'))
user.save()
return user4. admin.py
추가된 필드를 관리자 페이지에서 설정할 수 있도록 admin.py를 수정함
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
class CustomUserAdmin(UserAdmin):
model = User
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('phone_number', 'address', 'nickname')}),
)
add_fieldsets = UserAdmin.add_fieldsets + (
(None, {'fields': ('phone_number', 'address', 'nickname')}),
)
admin.site.register(User, CustomUserAdmin)5. settings.py
지금까지 설정한 환경을 settings.py에 반영함
INSTALLED_APPS = [
# dj_rest_auth를 사용하기 위해 추가함
'dj_rest_auth',
'dj_rest_auth.registration',
]
AUTH_USER_MODEL = 'accounts.User'
# user model 변경에 따른 register_serializer, adapters 등록
REST_AUTH = {
'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer',
}
ACCOUNT_ADAPTER = 'accounts.adapters.CustomUserAccountAdapter'Result
아래 이미지와 같이 register form이 변경된 것을 확인할 수 있음

'Study | 성장기록' 카테고리의 다른 글
| 할 게 너무 많다 (5) | 2024.12.06 |
|---|