Django - allauth signupform custom
Web/Django

Django - allauth signupform custom

뉴비뉴 2020. 1. 2.

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

댓글

💲 추천 글