Python Django 프로젝트의 관리자 페이지 커스터마이징하기
오늘은 Python django 프로젝트의 관리자 페이지를 커스터마이징을 해보려고 합니다.
이전 포스트
관리자 페이지 접근까지 실습을 진행한 블로그 글은 이 곳에 있습니다.
이 포스트에서는 이미 django 프로젝트를 생성하고 앱의 데이터베이스 생성 과정을 마무리지었다는 것을 가정하고 시작합니다.
데이터베이스 준비
from django.db import models
# Create your models here.
class DB(models.Model):
test = models.CharField(max_length=15)
permission = models.CharField(max_length=15,choices=(('test', "test"),('real', "real")),blank=True, null=True)
def __str__(self):
return self.test
모델을 생성해주기 위해 앱의 models.py 파일에서 Model 클래스로 구성해줍니다.
속성과 __str__ 메소드도 만들어줍니다.
python3 manage.py makemigrations [앱 이름]
python3 manage.py migrate [앱 이름]
앱의 데이터베이스에 대한 마이그레이션 파일을 준비해주고, 곧바로 프로젝트에 앱의 데이터베이스를 마이그레이션해줍니다.
관리자 url 변경하기
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('custom-admin/', admin.site.urls),
]
기본적으로 /admin 이었던 관리자 페이지의 경로를 변경할 수 있습니다.
관리자 페이지 오버라이딩
해당 글의 설명으로 코드를 대체합니다.
‘admin/index.html’ 파일을 extends해준다는 선언으로 새 문서 최상단에 기입한 뒤에 위 내용을 넣어주면 기존의 admin/index.html 파일을 확장해서 원하는 html 태그를 추가하거나 바꿀 수 있습니다.
django 프로젝트의 templates 폴더에서 admin를 만들어서 넣으면 됩니다.
관리자 페이지 문자열 변경
from django.contrib import admin
from .models import DB
# Register your models here.
admin.site.site_header = "Custom Admin"
admin.site.site_title = "Custom Admin Portal"
admin.site.index_title = "Welcome to Custom Admin Portal"
헤더나, 제목과 같은 문자열은 위처럼 직접 html 파일을 작성하는 것보다 admin.py 파일에서 고치는 것이 더 편합니다.
site_header, site_title, index_title을 적용할 수 있습니다.
기본 그룹 등록 해제
from django.contrib import admin
from .models import DB
from django.contrib.auth.models import Group
# Register your models here.
admin.site.unregister(Group)
admin.site.register(DB)
기본적으로 등록되있는 Group을 unregister해줄 수 있습니다.
모델 리스트 커스터마이징
from django.contrib import admin
from .models import DB
from django.utils.safestring import mark_safe
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
list_per_page = 5
list_display = ('id', 'test', 'permission')
list_editable = ('permission',)
list_filter = ('permission',)
admin.site.register(DB, MemberAdmin)
페이지당 갯수, 필드 정의, 데이터 필터 등을 admin.py 파일에서 고칠 수 있습니다.
검색창 추가
from django.contrib import admin
from .models import DB
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
search_fields = ('test',)
admin.site.register(DB, MemberAdmin)
어떤 데이터를 검색할 지에 대하여 지정할 수 있습니다.
데이터 순서
from django.contrib import admin
from .models import DB
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
ordering = ('id', 'test', 'permission',)
admin.site.register(DB, MemberAdmin)
각 데이터 필드들 중에서 정렬할 수 있는 필드를 지정할 수 있습니다.
필드셋
from django.contrib import admin
from .models import DB
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
fieldsets = (('기본', {'fields': (('test',),), },), ('범위', {'fields': (('permission',),), },))
admin.site.register(DB, MemberAdmin)
데이터를 추가할 때에 필요한 폼들이 많을 때는 필드셋을 설정하여 분할해줍니다.
액션 추가
from django.contrib import admin
from .models import DB
from django.contrib.auth.models import Group
from django.utils.safestring import mark_safe
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
def mark_real(self, request, queryset):
queryset.update(permission='real')
mark_real.short_description = "test/real 범위 변경"
actions = ["mark_real"]
admin.site.register(DB, MemberAdmin)
각자의 데이터들을 선택하고 수행할 액션을 정의할 수 있습니다.
short_description으로 관리자에 직접 보일 명칭을 작성하고, actions으로 등록하면 끝납니다.
위 코드는 선택된 데이터에서 permission의 데이터를 변경해주는 액션을 해주게 됩니다.
서버 확인
python3 manage.py runserver
서버를 구동해줍니다.
127.0.0.1:8000 으로 접속하면 hello, world와 미리 저장해둔 데이터베이스의 내용이 포함된 페이지가 출력됨을 알 수 있습니다.