티스토리 뷰

기존 django에서 쓰는 User를 확장시키는 방법은 OneToOne으로 확장하는 방법과 직접 커스터마이징 하는 방법이 있다.

대개 보면 OneToOne만 있고 커스터마이징은 없어서 직접 한번 해봤다.


1. models.py


우선은 User model을 작성한다.

class TbUser(AbstractBaseUser, PermissionsMixin):
user_id = models.CharField(max_length=16, unique=True, verbose_name='아이디')
email = models.CharField(max_length=50, verbose_name='이메일')
phone = models.CharField(max_length=11, verbose_name='핸드폰')
username = models.CharField(max_length=30, verbose_name='유저 이름')
birthday = models.CharField(max_length=8, verbose_name='생일')
sex = models.CharField(max_length=1, verbose_name='성별')


objects = TbUserManager()

# 유저 모델에서 필드의 이름을 설명하는 string입니다. 유니크 식별자로 사용됩니다
USERNAME_FIELD = 'user_id'

# createsuperuser 커맨드로 유저를 생성할 때 나타날 필드 이름 목록
REQUIRED_FIELDS = ['username']

def get_short_name(self):
return self.user_id

def get_full_name(self):
return self.user_id

def get_username(self):
return self.user_id

이후 해당 User model을 관리해줄 Manager를 만든다


class TbUserManager(BaseUserManager):
"""
전달된 데이터로 유저를 생성하고 저장합니다.
"""
def create_user(self, user_id, username, password):
if not user_id:
raise ValueError('ID Required!')

user = self.model(
user_id=user_id,
username=username,
)

user.set_password(password)
user.save(using=self._db)
return user

def create_superuser(self, user_id, username, password):
"""
전달된 데이터로 관리자를 생성하고 저장합니다.
처음은 manage.py를 이용해서 만듦(createsuperuser)
"""
user = self.create_user(user_id, username, password)

user.is_superuser = True
user.save(using=self._db)
return user

2. admin.py

다음은 Admin관련해서

class TbUserAdmin(UserAdmin):
# 필드들은 유저 모델을 표시하는데 사용됩니다.
# auth.User의 특정 필드를 참조하는 UserAdmin을 오버라이드합니다.

# 회원 업데이트 폼 연결
form = TbUserChangeForm
list_display = ('user_id', 'username', 'birthday', 'sex', 'email', 'phone', 'is_staff')
list_filter = ('is_staff', 'is_superuser', 'sex')
fieldsets = (
('아이디', {'fields': ('user_id', 'password')}),
('개인 정보', {'fields': ('username', 'birthday', 'sex', 'email', 'phone')}),
('권한', {'fields': ('is_staff',)}),
)

# 회원 추가 폼 연결
add_form = TbUserCreationForm
add_fieldsets = (
('기본 정보', {'fields': ('user_id', 'password1', 'password2')}),
('추가 정보', {'fields': ('username', 'birthday', 'sex', 'email', 'phone')})
)

search_fields = ('user_id', 'username',)
ordering = ('username',)
filter_horizontal = ()


# 이제 새로운 UserAdmin을 등록합니다.
admin.site.register(TbUser, TbUserAdmin)

# 그리고, 우리는 장고의 built-in 허가를 사용하고 있지 않으므로,
# admin에서 Group model을 제거합니다.
admin.site.unregister(Group)

기존의 Admin에서 쓰던것을 죄다 상속받아서 다시 작성해준다.


3. forms.py

class TbUserCreationForm(UserCreationForm):
# custom Form Field
# 기존의 sex 필드를 대체함
CHOICE = (('M', '남자'), ('W', '여자'))
sex = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICE, label='성별')

class Meta:
model = TbUser
fields = ('user_id',)

def clean_password2(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError('Password don`t match')

return password2

def save(self, commit=True):
# 비밀번호를 해시형태로 저장
user = super(TbUserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user


class TbUserChangeForm(UserChangeForm):
# 유저 업데이트 폼
# 모든 필드 포함, 비밀번호는 해시로 표시

password = ReadOnlyPasswordHashField(label="비밀번호")
class Meta:
model = TbUser
fields = ('user_id',)

form을 다시 작성해준다.

4. setting.py

AUTH_USER_MODEL = '[projectName].TbUser'


댓글
댓글쓰기 폼
공지사항
Total
3,384
Today
0
Yesterday
10
링크
«   2018/06   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함