User app은 다른 모델들과 다르게 특별하다. Django는 기본적으로 User 모델을 지원한다. 하지만 공식문서에서는 새로 만들어서 사용하는것을 권장한다.
[User application 생성 및 등록]
- python manage.py startapp users 실행
- config/settings.py에 app등록: INSTALLED_APPS
[User model 생성(AbsractUser상속)]
- users/model.py에 AbstractUser를 상속받는 User모델 생성
#-------------------- users/model.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
[나의 User model 등록]
- cofing/settings.py에 사용할 User모델 등록
#-------------------- config/settings.py
<생략 ...>
#제일 하단에 입력
#Auth
AUTH_USER_MODEL = "users.User"
[db 재생성]
- 원래 있는 User모델을 사용하지 않고 내가 만든 User모델을 사용하기 위해서는 기존의 User모델에 데이터가 들어있으면 안됨
- 그런데 이렇게 User모델을 커스텀하는 시점에서는 createsuperuser를 통해 User모델에 데이터를 만들었을 것임
- 따라서 db와 기존에 migration했던 파일들을 모두 지우고 새로 makemigrations > migrate를 진행
- db.sqlite 삭제
- 각 application의 migration폴더 안에 migration파일만 삭제: 폴더 지우지 말것, init.py파일도 지우지 말것
- 이렇게 하고 서버를 실행해 다시 admin페이지로 들어가보면 전에 생성했던 superuser 정보가 사라져 로그인되지 않음
- python manage.py createsuperuser 실행하여 admin 계정 만들기
- 들어가보면 처음과는 달리 admin패널에 User모델이 없는것을 알 수 있음
[User모델을 admin패널에 등록]
- 새로만든 User모델을 admin패널에서 사용하기 위해서는 user/admin.py에 register필요
- admin 패널에 모델을 등록하기 위해서는 admin.ModelAdmin패키지를 사용
- 하지만 새로 만든 User모델을 admin패널에 게시할때는 본래 존재하던 User모델을 컨트롤하기 위해 사용된 클래스를 상속받아야 함
- CustonUserAdmin 클래스 생성
- UserAdmin클래스 상속
#-------------------- users/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
# Register your models here.
@admin.register(User)
class CustomUserAdmin(UserAdmin):
pass
- 새로만든 User모델이 admin패널에 나타남
- 처음에 User모델은 인증 및 권한에 들어 있었으나 별도의 모델로 빠진것을 볼 수 있음
- 들어가서 세부 내용을 봐도 처음에 User내용을 변경할 수 있도록 되어있던것들 잘 돌아감
[User 모델 커스텀]
- 모델 커스텀을 위해 상속받은 AbstractUser를 커스텀 한다.
- 커스텀 방법은 아래 링크
App Models
Application(app)의 models.py에 작성한다. app에서 관리할 데이터를 정의하는 곳으로 database와 소통한다.결국 데이터베이스에서 사용할 table을 만드는 곳이다. 쿼리문을 적을필요 없이 클래스로 만들면
hiphan-mansoorrr.tistory.com
- 커스텀은 아래 내용으로 진행
- first_name, last_name은 사용하지 않음: editable=False
- name, is_host 필드는 새로 생성: default값 필수 지정
- makemigrations > migrate 진행하여 db에 반영
- admin패널 접속 하면 에러가 남
- first_name 필드는 non-editalbe field라는 뜻
- 에러가 나타나는 이유: 모델에서는 first_name을 editalbe=False로 지정했지만 admin패널에서는 editable을 false로 지정하지 않았기 때문. 따라서 모델에서 적용한 사항을 admin.py에서도 적용하도록 설정해야 함
[user admin커스텀]
- admin패널에서 user를 들어가면 에러가 난다.
- User모델에서는 first_name, last_name을 editable=False라고 했지만 admin에서는 수정할 수 있도록 되어있기 때문
- users/admin.py에 정의한 CustomUserAdmin은 UserAdmin을 상속받음
- 상속받은 UserAdmin을 살펴보면 first_name, last_name을 admin패널에서 사용할 수 있도록 해둠
#-------------------- 상속받은 UserAdmin
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
add_form_template = "admin/auth/user/add_form.html"
change_user_password_template = None
fieldsets = (
(None, {"fields": ("username", "password")}),
(_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
(
_("Permissions"),
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
)
add_fieldsets = (
(
None,
{
"classes": ("wide",),
"fields": ("username", "password1", "password2"),
},
),
)
<생략.....>
- 따라서 CustomUserAdmin의 내용들을 override해야함
- 상속받은 UserAdmin의 내용들 중 Permissions, Important dates 는 그대로 두고 Personal Info는 다른 내용들로 커스텀한다
class CustomUserAdmin(UserAdmin):
fieldsets = (
(
'Profile',
{
'fields': (
"name", "username", "password", "is_host",
)
}
),
(
"Permissions",
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
"classes": ("collapse", 'wide',)
},
),
(
"Important dates",
{
"fields": ('last_login', 'date_joined',),
"classes": ('collapse', 'wide',)
}
),
)
'FrameWork > Django' 카테고리의 다른 글
ORM (0) | 2024.07.15 |
---|---|
App Apps (0) | 2024.07.15 |
App Admin (0) | 2024.07.12 |
App Models (0) | 2024.07.12 |
Application (0) | 2024.07.11 |