안녕하세요. admin page에서, User나 Group에 대해서 custom하게 처리해야 할 때가 있을 겁니다. 예를 들자면, is_superuser의 경우, 못 보게 처리를 한다던지. auth_user_model을 바꾸는 방법도 있을 듯 합니다. 그런데, 예전에 제가 처리했던 방법을 공유해 드리도록 하겠습니다. 문서에 나온 방법과 비슷한 것도 있고요.

 


 먼저, UserAdmin을 override한 클래스를 admin.site에 register를 하려고 하면, 이미 등록되었다고 거부할 겁니다.

 

 이는 INSTALLED_APPS를 보면 쉽게 유추할 수 있는데요. django.contrib.admin 단계에서 register가 되겠구나. 정도로만 추측할 수 있어요.

 

 

 ContentTypesConfig가 들어왔습니다. django.contrib.contenttypes입니다. 이 상태에 이미 before_import_registry에 2개의 무언가가 들어와 있었습니다.

 

 

그리고 app config를 하려는 순간, 이미 auth.UserAdmin이 이미 등록되었다고 뜨네요.

 

 app을 초기화 하는 시점에, admin.site.register가 호출되게 되는데요. 이 시점에 이미 admin.site에는 User와 Group이 등록되어 있는 상태입니다.

 

 

 그렇기 때문에, 등록할 수 없다고 할 겁니다. 결국, "app" config 전에도 admin.site에서 모델을 register 했고, "app"을 config 할 때에도 admin.site에서 동일한 모델을 register를 했기 때문에 오류가 발생한 셈입니다.

 


 어떻게 하면 될까요? 좋은 방법 중 하나는, 아예 custom admin page를 하나 만드는 것입니다. 문서에서 소개하는 방법을 이용해 보겠습니다.

 

 

 먼저, MyAdminSite를 만들 거에요. AdminSite는 django.contrib.admin에 있습니다. MyAdminSite는 AdminSite만 override 하겠습니다. 다음에, admin_site = MyAdminSite(name="") 이라고 해 주었는데요. admin_site는 MyAdminSite의 object입니다.

 

 

 다음에 UserAdmin이랑 GroupAdmin은 각각, django.contrib.auth.admin의 UserAdmin과 GroupAdmin을 override 합니다. 이는, Group 어드민과 User 어드민에 설정되어 있는 속성들을 그대로 가지고 오기 위함입니다.

 

 이제 admin_site에 Post, User, Group을 register 해 줍니다. 여기까지 보면, 아래와 같이 도식화를 시킬 수 있겠습니다.

 

 

 이제, settings.py에 있는 admin url의 속성을 바꿔 주겠습니다.

 

 admin.py에서 정의한 admin_site를 import 합니다. path('admin/', admin.site.urls)를, path('admin/', admin_site.urls)로 바꿔줍니다. 그러면, admin을 주소창에 입력했을 때, 아래 그림에서 노란색으로 표시된 것을 타게 됩니다.

 

 

 이제, admin을 켜면 제대로 동작함을 확인할 수 있습니다.

 

 

 UserAdmin에 list_filter를 override 해 보겠습니다. UserAdmin의 list_filter에 "username" 필터를 추가합니다.

 

 그랬더니, username을 기준으로 필터를 거는 것이 추가되었음을 볼 수 있습니다.