Django 소스 코드를 수정하지 않고 관리자의 모델 목록을 등록 순서대로 표시합니다

2235 단어
Django의 admin 관리 백엔드는 강력한 도구였지만 모델 목록의 표시 순서는 모델 이름에 따라 왔다. 영어라면 알파벳 순서대로 찾기 쉽고 중국어라면 완전히 무질서하다. 한 앱에 있는 모델이 많으면 수정할 모델을 찾기 어렵다.
django 소스 코드를 보니 이 순서는admin 코드에서 죽은 것으로 설정할 수 있는 곳이 없습니다.하지만 이를 위해 원본 코드를 수정하는 것도 유지보수와 업그레이드가 쉽지 않다.그래서django 소스 코드를 수정하지 않은 상태에서 모델의 등록 순서에 따라 표시하면 관련 모델을 함께 표시할 수 있다는 생각을 했습니다.
사실 코드의 원리는 매우 간단합니다.django의admin site에 indexview와 appindexview 이 두 함수에 decorator를 추가하고 이 두 함수의 반환 값을 수정하면 됩니다.django 1.4부터 이 두 함수는 이미render가 좋은 HTML 페이지가 아니라 lazy의Template Response로 되돌아오기 때문입니다 (참고https://docs.djangoproject.com/en/1.4/ref/template-response/).이 물건은 필요할 때만 HTML 페이지를 만들 수 있으며, 그 전에도 안의context 를 수정할 수 있습니다.data.그러면 마지막render 템플릿을 사용할 때 수정된context데이터다.
마지막 소스 코드는 다음과 같습니다.# -*- coding: utf-8 -*-
from django.contrib import admin
from django.utils.text import capfirst
from django.utils.datastructures import SortedDict
def find_model_index(name):
    count = 0
    for model, model_admin in admin.site._registry.items():
        if capfirst(model._meta.verbose_name_plural) == name:
            return count
        else:
            count += 1
    return count
       
def index_decorator(func):
    def inner(*args, **kwargs):
        templateresponse = func(*args, **kwargs)
        for app in templateresponse.context_data['app_list']:
            app['models'].sort(key=lambda x: find_model_index(x['name']))
        return templateresponse
    return inner
registry = SortedDict()
registry.update(admin.site._registry)
admin.site._registry = registry
admin.site.index = index_decorator(admin.site.index)
admin.site.app_index = index_decorator(admin.site.app_index)
#admin.site.register(yourmodel, yourmodeladmin)

1. 먼저 질서정연한 사전을 사용하여 원래의 무질서한 사전을 등록 모델의 데이터 용기로 바꾸고 이미 존재하는 데이터를 새로운 질서정연한 사전으로 복사한다.
2、인테리어 index view 및 appindexview 이 두 함수,templateresponse의 반환값에 있는context 수정데이터, 등록할 때의 순서에 따라 다시 정렬합니다.
3、이후에 정상적인 django admin register 방식을 설치하여 사용하면 됩니다.
4. 주의해야 할 부분은 상술한 코드를 비교적 일찍 운행하는 곳에 두는 것이 좋다. 예를 들어settings.py에 자기가 쓴 앱에 있는 첫 번째 관리자.py 파일에서, 그렇지 않으면 이 코드가 실행되기 전에 등록된admin 모델은 순서가 없습니다.

좋은 웹페이지 즐겨찾기