您现在的位置是:主页 > news > 怎样维护网站建设/长春seo按天计费
怎样维护网站建设/长春seo按天计费
admin2025/5/1 20:02:48【news】
简介怎样维护网站建设,长春seo按天计费,北京塞车网站建设,网站开发常用软件文章目录问题背景1.分析admin.site.index2. 导航栏排序实现原理3.完整代码问题背景 当我们使用django的admin来做后台管理时,会有种如鱼得水的感觉,通过可视化的页面,开发人员能够轻松地管理数据库里的数据, 问题来了,在实际开发中…
文章目录
- 问题背景
- 1.分析admin.site.index
- 2. 导航栏排序实现原理
- 3.完整代码
问题背景
当我们使用django的admin来做后台管理时,会有种如鱼得水的感觉,通过可视化的页面,开发人员能够轻松地管理数据库里的数据, 问题来了,在实际开发中,需要管理的model可达到到上百个,如果不能够对菜单的顺序进行管理,那么当我们去寻找需要的model时,会非常的吃力,因为model多了就会显得杂乱无章,本文针对在jango的admin后台菜单导航栏的排序问题进行探讨!
1.分析admin.site.index
首先让我们看一下admin.site.index方法的源码,该方法用来给admin后台返回所有注册到admin后台的apps,即应用。
@never_cachedef index(self, request, extra_context=None):"""Display the main admin index page, which lists all of the installedapps that have been registered in this site."""app_list = self.get_app_list(request)context = dict(self.each_context(request),title=self.index_title,app_list=app_list,)context.update(extra_context or {})request.current_app = self.namereturn TemplateResponse(request, self.index_template or 'admin/index.html', context)
通过index方法返回的TemplateResponse,我们可以拿到导航栏里的所有注册到admin后台的apps。
app_list = templateresponse.context_data['app_list']
获取到导航栏结构,对应的数据结构如下, 其中student为我在polls应用下定义的model:
[{'name': 'Authentication and Authorization','app_label': 'auth','app_url': '/admin/auth/','has_module_perms': True,'models': [{'name': 'Groups','object_name': 'Group','perms': {'add': True,'change': True,'delete': True},'admin_url': '/admin/auth/group/','add_url': '/admin/auth/group/add/'}, {'name': 'Users','object_name': 'User','perms': {'add': True,'change': True,'delete': True},'admin_url': '/admin/auth/user/','add_url': '/admin/auth/user/add/'}]
}, {'name': 'Polls','app_label': 'polls','app_url': '/admin/polls/','has_module_perms': True,'models': [{'name': '学生','object_name': 'Student','perms': {'add': True,'change': True,'delete': True},'admin_url': '/admin/polls/student/','add_url': '/admin/polls/student/add/'}]
}]
可以发现,我们应用注册的model都到了app_label=="polls"里面,具体的Model信息放到了models属性里, 结构如下
'models': [{'name': '学生','object_name': 'Student','perms': {'add': True,'change': True,'delete': True},'admin_url': '/admin/polls/student/','add_url': '/admin/polls/student/add/'}]
由上述可以发现,如果我能够调整里面Models列表里的元素顺序,那么在admin后台显示出导航栏的顺序也会发生变化。
2. 导航栏排序实现原理
定义的app的顺序为: User , Student,Entry, 放到apps_index列表里。 然后通过自定义model放到apps_index列表里,遍历models列表,从apps_index列表里找出对应的model顺序,同时用新的model去放[{pos: 原先的model },…], 将得到的新的model,按照pos从小到大来进行排序, 最后只要获取到model里的属性, 将获取到的models重新赋值给app_list原有的models。
app_list = templateresponse.context_data['app_list']app_list.sort(key=lambda r: find_app_index(r['app_label']))print("app_list:", app_list)for app in app_list:##polls为app的名称if app["app_label"] == "polls":# 按照指定顺序排序models = app["models"]new_models = []for i in models:model_name = i["object_name"]pos = apps_index.index(model_name)new_models.append({"pos": pos, "model": i})new_models.sort(key=lambda s: s["pos"])# app['models'].sort(key=lambda x: find_model_index(x['name']))models = [x["model"] for x in new_models]app["models"] = modelsprint("models:", models)
导航列表:
apps_index = ["User", "Student", "Entry"]
3.完整代码
from django.contrib import admin
from django.apps import apps
from polls.models import Student, User, Entry# Register your models here.class FlatPageAdmin(admin.ModelAdmin):fieldsets = ((None, {'fields': ('url', 'title', 'content', 'sites')}),('Advanced options', {'classes': ('collapse',),'fields': ('registration_required', 'template_name'),}),)class StudentAdmin(admin.ModelAdmin):list_display = ('name', 'birthday', 'amount')search_fields = ('name',)class UserAdmin(admin.ModelAdmin):list_display = ["id"]search_fields = ["id"]class EntryAdmin(admin.ModelAdmin):list_display = ["id"]search_fields = ["id"]admin.site.register(Student, StudentAdmin)
admin.site.register(User, UserAdmin)
admin.site.register(Entry, EntryAdmin)# 指定导航顺序
apps_index = ["User", "Student", "Entry"]def find_app_index(app_label):app = apps.get_app_config(app_label)main_menu_index = getattr(app, 'main_menu_index', 9999)return main_menu_indexdef index_decorator(func):def inner(*args, **kwargs):templateresponse = func(*args, **kwargs)app_list = templateresponse.context_data['app_list']app_list.sort(key=lambda r: find_app_index(r['app_label']))print("app_list:", app_list)for app in app_list:if app["app_label"] == "polls":# 按照指定顺序排序models = app["models"]new_models = []for i in models:model_name = i["object_name"]pos = apps_index.index(model_name)new_models.append({"pos": pos, "model": i})new_models.sort(key=lambda s: s["pos"])# app['models'].sort(key=lambda x: find_model_index(x['name']))models = [x["model"] for x in new_models]app["models"] = modelsprint("models:", models)return templateresponsereturn inneradmin.site.index = index_decorator(admin.site.index)
admin.site.app_index = index_decorator(admin.site.app_index)
admin.site.site_header = "bingbing后台管理"
admin.site.site_title = 'bingbing后台管理'
admin.site.index_title = 'bingbing后台管理'
显示效果将会按照指定的导航列表里的顺序来展示 , 另外需要注意的是将注册的Model名称添加到 apps_index里即可!
django-admin后台目录菜单过多怎么办?