본문 바로가기
FrameWork/Django

App User

by mansoorrr 2024. 7. 13.

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모델이 없는것을 알 수 있음

좌: 처음등록한 superuser없어짐 / 우: superuser등록하고 들어간 모습(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모델 추가됨
admin패널에서 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