본문으로 바로가기

User 모델에서 Username 을 Email 로 재정의

category 장고/MTV 2019. 4. 18. 21:20

최근 트렌드에서 아이디 대신에 이메일을 입력받아 처리하는 시스템으로 구현

# models.py

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import AbstractUser, PermissionsMixin
from django.db import models


class UserManager(BaseUserManager):
    """User 에서 사용하기 위한 UserManager 생성"""
    def create_user(self, email, password=None, **extra_fields):
        """일반 유저로 생성할 경우"""
        if not email:
            raise ValueError('이메일을 입력해주세요')

        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, email, password):
        """superuser 로 user 를 생성할 경우 필드값을 True 로 변경"""
        user = self.create_user(email, password)
        user.is_superuser = True
        user.is_staff = True
        user.save(using=self._db)

        return user


class User(AbstractBaseUser, PermissionsMixin):
    """UserManager 를 objects 필드에 사용"""
    CHOICE_GENDER = (
        ('man', '남성'),
        ('woman', '여성')
    )

    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    alias = models.CharField(max_length=20, null=True)
    gender = models.CharField(max_length=5, choices=CHOICE_GENDER)
    profile_img = models.ImageField(upload_to='profile', null=True)
    cover_img = models.ImageField(upload_to='cover', null=True)
    introduce = models.TextField(max_length=255)

    # UserManager 을 재정의하여 사용
    objects = UserManager()
    # USERNAME 를 email 로 사용
    USERNAME_FIELD = 'email'

# settings.py

# App.Class 이름으로 지정
AUTH_USER_MODEL = 'members.User'

# forms.py

- form 은 선택사항이지만 cleaned_data[] 로 데이터를 확인하는 것이 보다 정확한 검증이므로 개인적으로는 권장사항

class SignupForm(UserCreationForm):
    CHOICE_GENDER = (
        ('man', '남자'),
        ('woman', '여자')
    )
    email = forms.EmailField(label='아이디')
    name = forms.CharField(max_length=10, label='이름')
    password1 = forms.PasswordInput()
    password2 = forms.PasswordInput()
    alias = forms.CharField(max_length=50, label='닉네임')
    gender = forms.CharField(label='성별', widget=forms.Select(choices=CHOICE_GENDER))
    profile_img = forms.ImageField(label='프로필 이미지(선택)', widget=forms.ClearableFileInput(), required=False)
    cover_img = forms.ImageField(label='커퍼 이미지(선택)', widget=forms.ClearableFileInput(), required=False)
    introduce = forms.CharField(label='자기소개', widget=forms.Textarea)

    class Meta:
        model = User
        fields = ['email', 'name', 'password1', 'password2', 'alias',
                  'gender', 'profile_img', 'cover_img', 'introduce']


    def __init__(self, *args, **kwargs):
        # SignupForm 을 재정의하여 모든 template class 속성을 'form-control' 로 지정
        super(SignupForm, self).__init__(*args, **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control'

'장고 > MTV' 카테고리의 다른 글

장고 CRUD 기능 구현(1) Create  (0) 2019.05.07
Login 기능 구현하기  (0) 2019.04.21
try, except 와 if else 를 써야할 때  (0) 2019.03.14
AbstractBaseUser 모델  (0) 2019.03.01
구문 분석 오류(could not parse ...)  (1) 2019.02.20