작성이유
Django 관리자 페이지의 index를 커스텀 하고 싶은데 AdminSite 를 상속받아 만들지 않고 좀더 간단하게 하고 싶었다.
그래서 AdminSite의 메소드를 바꿔 버리는 조금 위험하지만 편한 트릭을 알게되어 적용 해보았다.
설명
설명이 따로 없다.
기본 AdminSite의 index 함수와 each_context를 다른 함수로 교체(?) 바꾸어 버리는 방법을 사용
#project/config_app/admin_site/base.py
import types
from django.contrib import admin
from django.contrib.admin import AdminSite
from django.contrib.auth import get_user_model
from django.shortcuts import redirect
User = get_user_model()
def setting_admin_index(context):
    # 인덱스 데이터를 셋팅
    context['total_users'] = User.objects.all().count()
def index(site_object, request, extra_context=None):
    # 인덱스 페이지를 접근 할 때 호출 되는 함수를 재정의
    if not request.user.is_staff:
        return redirect('home')
    else:
        return AdminSite.index(site_object, request, extra_context)
def each_context(site_object, request):
    # context데이터를 가공하여 보냄
    context = AdminSite.each_context(site_object, request)
    # admin인 경우에만 해당 인덱스 페이지를 가져옴
    if request.path == '/admin/':
        setting_admin_index(context)
    return context
# admin.site의 기본 함수를 교체 해버림.
admin.site.index = types.MethodType(index, admin.site)
admin.site.each_context = types.MethodType(each_context, admin.site)
Comments