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에서 관리를 위해 기본적으로 제공해준 페이지
- 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에서 인식 가능하게
'web > django' 카테고리의 다른 글
Django JWT 토큰 기반의 인증 방식 환경 세팅하기 (0) | 2024.05.20 |
---|---|
Django Cookie, Session, 그리고 JWT (0) | 2024.05.20 |
Django serializer 활용하기 - advanced (0) | 2024.05.14 |
Django 모델 생성하고 Many-To-Many 관계 형성하기 (0) | 2024.05.14 |
Django 모델 생성하고 One-To-Many 관계 형성하기 (0) | 2024.05.13 |