https://django-allauth.readthedocs.io/en/latest/forms.html
Forms — django-allauth 0.32.0 documentation
© Copyright 2017, Raymond Penners Revision ef077431.
django-allauth.readthedocs.io
allauth의 SignupForm은 기본적으로 username과 email, password1, password2를 제공해준다.
default_field_order = [
'email',
'email2', # ignored when not present
'username',
'password1',
'password2' # ignored when not present
]
하지만 나는 agree_terms와 agree_marketing을 추가하고 싶었다.
User 모델을 OnetoOne으로 생성하여 수정하거나 AbstractBaseUser 를 사용하여 커스텀할 때
회원가입 시 받아야 하는 데이터가 더 생길 수 있다. 이럴 때 signupform을 사용하면 된다.
settings.py
users(앱이름).forms(forms.py).MyCustomSignupForm(클래스이름)
ACCOUNT_FORMS = {'signup': 'users.forms.MyCustomSignupForm'}
forms.py
class MyCustomSignupForm(SignupForm):
agree_terms = forms.BooleanField(label='서비스 이용약관 및 개인정보방침 동의')
agree_marketing = forms.BooleanField(label='마케팅 이용 동의')
def save(self, request):
user = super(MyCustomSignupForm, self).save(request)
user.agree_terms = self.cleaned_data['agree_terms']
user.agree_marketing = self.cleaned_data['agree_marketing']
user.save()
return user
분석하기 전에 모델에 대해 이해할 필요가 있었다.
나는 유저 모델을 새롭게 만드는 것이기 때문에 AbstractBaseUser, BaseUserManager 를 상속받아 사용하였다.
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)
class UserManager(BaseUserManager):
def create_user(self, email, agree_terms, agree_marketing, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
agree_terms=agree_terms,
agree_marketing=agree_marketing,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, agree_terms, agree_marketing, password):
user = self.create_user(
email,
password=password,
agree_terms=agree_terms,
agree_marketing=agree_marketing,
)
user.is_admin = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
email = models.EmailField(
verbose_name='email',
max_length=255,
unique=True,
)
agree_terms = models.BooleanField(default=False)
agree_marketing = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['agree_terms', 'agree_marketing']
def __str__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
create_superuser의 경우 우리가 생각하는 python manage.py createsuperuser와 같다.
create_superuser 시 입력해야 되는 값을 USERNAME_FIELD와 REQUIRED_FIELDS에서 지정할 수 있다.
BooleanField 의 경우 true를 입력해야 될 줄 알았는데 t or f 를 입력해야되는거 같았다.
삽질일기
회원가입 시 생일을 입력하게 하기 위해 date_of_birth를 넣어주었고, 위와 같은 오류가 나서
나는 def save()시 값이 User모델에 저장이 안되서 나오는 오류인줄 알았다.
알아보니 DataField에 null=True를 적어주면 해결되는 것이였다.
급할수록 돌아가자...
'Web > Django' 카테고리의 다른 글
Django - pipeline (0) | 2020.01.31 |
---|---|
Django - 공식문서 뿌시기 스터디(1. Model) (0) | 2020.01.02 |
Django allauth User has no field named 'username' 해결방법 (0) | 2019.12.30 |
Django-crontab 사용 (0) | 2019.12.06 |
Django filter(__day) (0) | 2019.12.05 |
댓글