728x90
삽질 기간: 3~4일
dj_rest_auth registration custom 등록 등 별의 별 검색어로 3~4일 동안 찾아보다가 구글에 있는 정보로 적용해보아도 안됨.
dj_rest_auth github 소스를 보고 직접 디버깅하여 구조 파악 후 어디서 필드 추가 되어 등록되는지 찾아보고 확인해서 써보는 글
dj-rest-auth 4.0.0 version
dj_rest_auth registration custom
- CustomRegisterSerializer 생성
from dj_rest_auth.registration.serializers import RegisterSerializer
class CustomRegisterSerializer(RegisterSerializer):
add_field_1 = serializers.CharField()
# RegisterSerializer에서 get_cleaned_data() 오버라이딩 해서 사용합니다.
def get_cleaned_data(self):
# RegisterSerializer의 get_cleaned_data()를 기본적으로 가져옵니다.
# def get_cleaned_data(self):
#return {
# 'username': self.validated_data.get('username', ''),
# 'password1': self.validated_data.get('password1', ''),
# 'email': self.validated_data.get('email', ''),
#}
cleaned_data= super().get_cleaned_data()
# 추가할 feild를 추가합니다.
cleaned_data['add_field_1 '] = self.validated_data.get('add_field_1 ', '')
return cleaned_data
- CustomAccountAdapter 생성
from allauth.account.adapter import DefaultAccountAdapter
from allauth.account.utils import user_field
# DefaultAccountAdapter에서 save_user() 오버라이딩 해서 사용합니다.
class CustomAccountAdapter(DefaultAccountAdapter):
def save_user(self, request, user, form, commit=False):
# DefaultAccountAdapter의 save_user()를 기본적으로 가져옵니다.
user = super().save_user(request, user, form, commit)
# 여기서 form 은 위에 CustomRegisterSerializer 입니다. cleaned_data를 가져옵니다.
data = form.cleaned_data
# utils 의 user_field를 사용해 user_field를 추가합니다.
user_field(user, "add_field_1 ", data.get("add_field_1 "))
# 저장
user.save()
return user
# DefaultAccountAdapter 에서 save_user() 의 기본구조
# def save_user(self, request, user, form, commit=True):
"""
Saves a new `User` instance using information provided in the
signup form.
"""
# from .utils import user_email, user_field, user_username
# data = form.cleaned_data
# first_name = data.get("first_name")
# last_name = data.get("last_name")
# email = data.get("email")
# username = data.get("username")
# user_email(user, email)
# user_username(user, username)
# if first_name:
# user_field(user, "first_name", first_name)
# if last_name:
# user_field(user, "last_name", last_name)
# if "password1" in data:
# user.set_password(data["password1"])
# else:
# user.set_unusable_password()
# self.populate_username(request, user)
# if commit:
# Ability not to commit makes it easier to derive from
# this adapter by adding
# user.save()
# return user
# utils 의 user_field
# def user_field(user, field, *args):
"""
Gets or sets (optional) user model fields. No-op if fields do not exist.
"""
# if not field:
# return
# User = get_user_model()
# try:
# field_meta = User._meta.get_field(field)
# max_length = field_meta.max_length
# except FieldDoesNotExist:
# if not hasattr(user, field):
# return
# max_length = None
# if args:
# Setter
# v = args[0]
# if v:
# v = v[0:max_length]
# setattr(user, field, v)
# else:
# Getter
# return getattr(user, field)
- Custom User Model 생성
from django.contrib.auth.models import AbstractUser
from .managers import UserManager
class User(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
add_field_1 = models.CharField(max_length=10, blank=True, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['add_field_1']
objects = UserManager()
def __str__(self):
return self.email
- Setting 등록
# CustomRegisterSerializer 등록
REST_AUTH = {
'REGISTER_SERIALIZER': 'accounts.serializers.CustomRegisterSerializer',
}
# CustomAccountAdapter 등록
ACCOUNT_ADAPTER = 'accounts.adapter.CustomAccountAdapter'
# AUTH_USER_MODEL 등록
AUTH_USER_MODEL = 'accounts.User'
728x90
'파이썬' 카테고리의 다른 글
Pyqt Pyside 에서 show, hide 인지 확인하는법 (0) | 2023.06.14 |
---|---|
pyqt label 에 a태그 클릭 시 링크 오픈 안될 경우 (0) | 2023.06.01 |
문자열 원하는 길이로 자르기 (0) | 2023.05.15 |
파이썬 filter, lambda를 이용한 새로운 리스트 만들기 (0) | 2023.04.10 |
셀레니움 크롬 드라이버 이용하여 실행 파일 만들 때 tqdm 오류 (0) | 2023.03.21 |