# 개인 학습용 기록글 입니다
4. 공통 User 클래스 작성하기
class User(AbstractBaseUser, PermissionsMixin):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
email = models.EmailField(
verbose_name="이메일",
max_length=255,
unique=True,
)
nickname = models.CharField(max_length=20, null=False, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = [
"nickname",
]
objects = UserManager()
status = models.CharField(
max_length=10, default=USER_STATUS.get("ACTIVE", "ACTIVE")
)
def __str__(self):
return self.email
class Meta:
db_table = "user"
- id가 PK로 쓰였음
PK: Primary Key
데이터를 특징함
테이블당 하나의 필드에만 존재 - verbose_name: admin 페이지 목록에 보일 명칭 작성
- objects: UserManager클래스를 상속받음
- is_active, is_admin는 필수필드
라고 하는데, is_admin 필드를 건드린 코드는 없다. 나중에 오류 가능성을 염두해야한다
유저 모델은 여기까지하고, 후속작업은 나중에 하기.
이 상태에서 [django> admin페이지 > user추가] 진행하면 오류가 발생한다
admin패널에서 [user 수정/추가]시에 보일 필드를 커스텀해줘야하기 때문이다.
[users > form.py]
1. 패키지 가져오기
from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from .models import User
2. UserCreationForm 클래스 작성
# 유저생성
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label="비밀번호", widget=forms.PasswordInput)
password2 = forms.CharField(label="비밀번호 확인", widget=forms.PasswordInput)
class Meta:
model = User
fields = ("email", "nickname")
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("비밀번호가 일치하지 않습니다. ")
return password2
def save(self, commit=True):
user = super().save(commit=False)
user.set_pasword(self.cleaned_data["password1"])
if commit:
user.save()
return user
- 비밀번호 확인을 위한 password1, password2 & def clean_password2 : 비밀번호 확인 용도
- class Meta: django에서 메타클래스의 옵션을 계속 살펴보고 있는데 모르겠다. 공부해야할 주제다
용도는 알아도 응용을 위한 정확한 파악은 못하겠으나 User모델의 email, nickname 필드를 지정해줬다 - def save: 유저 저장
3. UserChangeForm 클래서 작성
# 유저수정
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = User
fields = (
"email",
"nickname",
"password",
"is_active",
"is_staff",
"is_superuser",
)
def clean_password(self):
return self.initial["password"]
유저 수정할 때 건드릴 수 있게 될 필드를 등록해준다.
몇번의 오류로 보니, 이 form에서 fields에는 기본 설정값(default)이 지정된 필드만 등록 가능하다
[users > admin]
1. 패키지
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group
from .forms import UserChangeForm, UserCreationForm
from . import models
BaseUserAdmin도 import해주고 forms.py에서 작성한 클래스도 가져오기.
2. UserAdmin 클래스 작성
@admin.register(models.User)
class UserAdmin(BaseUserAdmin):
form = UserChangeForm
add_form = UserCreationForm
list_display = ("email", "nickname", "is_staff")
list_filter = ("is_staff",)
fieldsets = (
(None, {"fields": ("email", "password")}),
("개인정보", {"fields": ("nickname",)}),
("권한", {"fields": ("is_staff",)}),
)
add_fieldsets = (
(
None,
{
"classes": ("wide",),
"fields": ("email", "nickname", "password1", "password2"),
},
),
)
search_fields = ("email",)
ordering = ("email",)
filter_horizontal = ()
admin.site.unregister(Group)
admin호면에서 볼 필드를 정리해준다
도움된 글
DeKu님의 포스팅, 장고(django)의 커스텀 유저 모델