Django 소스 코드를 수정하지 않고 관리자의 모델 목록을 등록 순서대로 표시합니다
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 모델은 순서가 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.