web/django

Django User 모델과 admin page

민사민서 2024. 5. 20. 17:47

Django Default User model

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    username_validator: UnicodeUsernameValidator = ...

    username = models.CharField(max_length=150)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=150, blank=True)
    email = models.EmailField(blank=True)
    is_staff = models.BooleanField()
    is_active = models.BooleanField()
    date_joined = models.DateTimeField()

    EMAIL_FIELD: str = ...
    USERNAME_FIELD: str = ...
    def get_full_name(self) -> str: ...
    def get_short_name(self) -> str: ...
    def email_user(
        self, subject: str, message: str, from_email: str = ..., **kwargs: Any
    ) -> None: ...

class User(AbstractUser):
    objects: ClassVar[UserManager[Self]]  # type: ignore[assignment]

AbstractUser 클래스 내에 여러 field와 method가 작성되어 있고, 이를 User 모델이 상속받고 있음

우리는 User 모델을 상속받아 필드들 추가해서 사용하고 있었던 것

 

<필수 field>

  • username : user가 사용할 이름이다.
  • password : user가 사용할 비밀번호다.

<추가 field> (다양한 user 정보를 활용하고자 할 때를 위해 만들어져 있습니다.)

  • email : user가 등록한 email 값이다.
  • first_name : user first name 값이다.
  • last_name : user last name 값이다.
  • is_staff : user admin site에 접근할 수 있는지 결정하는 boolean 값이다.
  • is_active : user의 삭제 여부를 나타내는 boolean 값이다.
  • is_superuser : user superuser 인지를 보여주는 boolean 값이다.
  • last_login : user가 마지막으로 로그인한 기록을 보여주는 datetime 값이다.
  • date_joined : user가 가입한 기록을 보여주는 datetime 값이다.

<is_active 관련 추가 내용> (즉 soft delete를 사용하기 위한 필드)

  • hard delete: DB에서 데이터를 물리적으로 삭제하는 것
  • soft delete: 데이터의 삭제 여부를 나타내는 column을 만들어 해당 데이터가 삭제되었음을 나타내는 것

https://docs.djangoproject.com/en/4.1/ref/contrib/auth/

 

SuperUser 생성 + admin page 이용해보기

- superuser란 모든 권한을 갖는 관리자 계정 (Django가 default로 제공)

- 서비스 내의 데이터를 생성, 열람,  수정,  제거하는 작업이 모두 가능한 User 객체

- 또한 superuser는 일반 user와 달리 admin page에도 접근할 수 있음

(.venv) C:\~~\django-seminar>python manage.py createsuperuser
Username (leave blank to use 'runner'): adminseo
Email address: ms05251@naver.com
Password:
Password (again):
The password is too similar to the username.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

 

admin 페이지란? project의 urls.py로 들어가보면

urlpatterns = [
    path("admin/", admin.site.urls),

맨 처음 admin/ 이라는 페이지가 있음 => Django에서 관리를 위해 기본적으로 제공해준 페이지

 

superuser 계정으로 로그인해보면!

- admin page에서는 superuser 계정으로 코드 수정 없이 모델의 객체를 추가, 수정, 삭제하는 등의 작업을 편리하게 함

- 즉, admin page에서 데이터를 조작하면, 그 결과가 실제 DB에도 반영이 됨

- admin page를 별도로 만들 필요 없다는 차별화된 특징!

 

admin page에서 User 생성, 수정, 삭제하기

생성하기

Validation error 발생하는 경우

1. **UserAttributeSimilarityValidator**: user attributes(default는 username, first name, last name, email)와의 유사도 확인
2. **MinimumLengthValidator**: 최소 길이(default는 8)를 만족하는지 여부 확인
3. **CommonPasswordValidator**: password가 일반적인지 여부 확인(20,000개와 비교)
4. **NumericPasswordValidator**: password가 숫자로만 이루어져있는지 여부 확인

 

수정하기
삭제하기

 

 

User 모델을 확장한 UserProfile 모델

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    college = models.CharField(max_length=32, blank=True)
    major = models.CharField(max_length=32, blank=True)

    def __str__(self):
        return f"id={self.id}, user_id={self.user.id}, college={self.college}, major={self.major}"

account/models.py 코드

이런 모델을 만들었었음, User 모델과 1to1 관계를 가지는 모델

- UserProfile 객체의 .user 을 통해 매칭되어 있는 User 객체에 접근할 수 있고

- 반대로 User 객체의 .userprofile을 통해 매칭되어 있는 UserProfile 객체에 역방향으로도 접근할 수 있음

 

Django admin 페이지에서 UserProfile 모델을 확인하고 싶어!!

from django.contrib import admin
from .models import UserProfile

admin.site.register(UserProfile)

account/admin.py  에서 모델을 등록함으로써 admin page에서 인식 가능하게

 

User profiles에서 +Add 클릭하고, 연결하고자 하는 User 객체 선택하고 정보 입력 ㄱㄱ
auth_user DB를 봐도 잘 반영되어 있더라