코규리
article thumbnail

# 개인 학습용 기록글 입니다 

 

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)의 커스텀 유저 모델