이번에는 Admin Page를 Customizing 해보도록 하겠다. 그중에서 User 페이지를 커스터마이징 해보겠다.
※ admin.py 수정하기 - list_display / list_filter 수정하기
우리가 Django를 처음 실행시키고 localhost:8000/admin 에 들어가서 user 페이지에 들어가면 다음과 같은 화면을 볼 수 있을 것이다:
현재 유저네임 / 이메일 / 이름 / 성 / 관리자 여부 를 보여주고 있고, 오른쪽 사이바에서는 이를 필터할 수 있는 내용들이 있다 (관리자여부 / 슈퍼관리자여부 / 활동상태여부 / 그룹)
하지만 예를 들어, 우리는 이에 더해 사용자의 활동상태를 보고 싶다. 또한 슈퍼관리자여부는 필터에서 지우고 싶다. 이를 하기 위해서는 우리의 app 에 있는 admin.py를 수정해야 한다. 다음의 코드를 한번 보자:
# admin.py
from django.contrib import admin
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
여기서 list_display는 우리가 위의 사진에서 봤던 이미 보여지고 있는 사항들이다. list_filter의 경우는 이제 사이드바에 있는 filter할 수 있는 사항들인 것이다. 우리는 여기서 list_display와 list_filter을 수정하면 된다:
from django.contrib import admin
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active')
list_filter = ('is_staff', 'is_active', 'groups')
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
이렇게 설정을 하면 다음과 같이 admin 페이지가 바뀐다:
※ admin.py 수정하기 - search_fields 수정하기
만약 여기서 특정 사용자를 검색하고 싶다면 어떻게 해야될까? 또는 특정 단어 또는 이메일인 사용자를 검색하고 싶다면 어떻게 해야될까?? 이럴 때 사용하는 것이 search_fields이다:
from django.contrib import admin
from .models import *
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active')
list_filter = ('is_staff', 'is_active', 'groups')
search_fields = ('username', 'email')
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
search_fields안에 정의된 내용을 우리는 검색을 할 수 있는데, 이렇게 한 후 admin page를 보게 된다면 화면은다음과 같이 보여진다:
이제 검색창에 username 또는 email을 입력하여 사용자를 검색할 수 있다.
또한, unregister(User)를 하고 register(User, UserAdmin)을 하는 이유는 Django Github에 보면 User를 UserAdmin을 불러와서 register 시킨다. 우리가 이를 덮어 씌우는 것이기 때문에, unregister 이후 User라는 이름으로 UserAdmin register의 절차를 반복해주는 것이다.
여기서 중요한 것은, list_display에 ManyToManyField를 넣으면 에러가 난다. OneToOneField를 넣어야만 가능하다. 만약 ManyToManyField를 넣고 싶다면, 여기를 한번 참고하길 바란다. 나중에 이에 대해 포스팅할 수 있도록 하겠다.