본문 바로가기

TIL

[TIL 2024. 05. 21] Django admin page custom 트러블 슈팅

ModelAdmin과 UserAdmin

문제상황

 

1주차 test때와는 달리 실제 프로젝트에서는 User모델을 장고에서 기본적으로 제공하는 auth_user모델을 사용할 수가 없었다. 왜냐하면 우리가 필요한 필드들을 추가로 더 정의해줘야 했기 때문이다. 그래서 CustomUser모델을 정의하고, 이를 settings.py에 등록해줬다.

 

하지만 막상 admin page내에서 다음과 같은 문제가 있었다.

 

1. add user시 필드 항목이 우리가 model에서 지정한 항목에 대한 입력폼이 나타나지 않고, username과 password, password recheck폼만 나옴 

2. 페이지의 필드 항목들의 정렬 상태가 (auth_user모델을 사용할 때와는 달리) 뒤죽박죽 엉켜서 나옴

3. staff status만 가지고 있는 일반 스태프의 계정을 admin계정으로 생성 후, 일반 스태프 계정으로 admin page 로그인 시도 시 로그인이 막힘

4. DB에 저장된 user정보의 password가 hassing처리되지 않고, raw문자열 그대로 저장됨을 확인


트러블 슈팅

 

구글링 결과 stackoverflow에서 특히 도움이 되는 글들을 많이 발견할 수 있었다.

 

먼저 3,4번 문제의 이유는 CustomUser모델에 대해서 UserAdmin을 사용하지 않고, 다른 모델들과 마찬가지로, ModelAdmin을 사용한 것 때문이었다.

 

즉, CustomUser모델 사용시에는 settings.py에 등록해주는 것은 물론 admin.py에서도 "UserAdmin"을 상속 받아서 해당 속성과 메소드를 사용해야 오류 없이 스태프 계정으로도 admin page에의 로그인이 가능하며, DB에 저장되는 password정보도 raw한 문자열이 아니라 암호화되어 처리된다.

 

 

 

Staff user can't login to django admin panel

I am trying to create a custom user model in my django app. But Whenever I tried to do so, I can't login with "staff user" created by the "super user" from the admin panel. It s...

stackoverflow.com

 


 

그리고 1,2번 문제의 해결은 UserAdmin을 사용하면서 그의 속성을 활용하여 해결할 수 있었다.

 

즉, add_fieldset을 통해 add user시의 입력폼에서 username, password, password recheck폼 외에도 우리가 필요로 하는 폼들을 추가해서 admin page에서 사용할 수 있다.

 

또 입력폼의 순서가 문제 되었던 2번 문제는 add_fieldsets내에서 "fields"속성을 통해 원하는 순서대로 필드들을 정렬해줌으로써 해결할 수 있었다.

 

이때, 주의할 점은 이를 register할 때는 User 모델 뿐만 아니라 Custom한 UserAdmin도 함께 등록해줘야 한다는 점이다.

accounts/admin.py

 

 

Custom add user form in Django Admin?

How can you use a custom “add user” form along with a custom “user model”? After defining a custom User model for email login, it is important that the “add user” form asks for an email and not a username to create a user. This is the form that

forum.djangoproject.com