최근 트렌드에서 아이디 대신에 이메일을 입력받아 처리하는 시스템으로 구현
# 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 |