Xadmin左侧菜单——菜单栏排序

目录

1.重写菜单

2.菜单排序


xadmin的后台页面左侧菜单默认情况排序混乱,想要按照自己意愿进行排序有两种方式:编辑菜单函数和添加排序代码。两种方法可以同时使用。

1.编辑菜单函数

我们在使用xadmin后台时,使用Golabsettings来修改界面的全局配置,网上搜索xadmin的常用包括了主题、menu_style、apps_icons、site_title和site_footer。重写菜单函数为get_site_menu。这样写的菜单不需要admin里注册,可添加多级菜单,可跳转其他外部链接。

import xadmin
from xadmin import views
from xadmin.layout import Fieldset,Row
from xadmin.util import sortkeypicker
from xadmin.views.base import filter_hook
from xadmin.plugins.auth import UserAdmin
from xadmin.layout import Fieldset, Main, Side, Row
from .models import UserProfile,Project_name,Project_position,Company_name,SingleSet,Userinfo

#主题
class BaseSetting(object):
    enable_themes = True
    use_bootswatch = True

#修改全局配置
class Golabsettings(object):
    site_title = u'XYRHCM数据中心(城市管理数据中心)'#
    site_footer = u'业务理念:专业、严谨、高效、创新 —— —— 团队精神:奉献、务实、协同、创新 —— —— 发展理念:守正出新,行稳致远 —— —— 核心使命:固诚信之本、法天地之道、铸非凡之业'
    menu_style = 'accordion'#导航折叠
    #大模块图标
    apps_icons = {
        "notice": "fa fa-envelope-open",    # 通知公告1
        }
    #菜单
    def get_site_menu(self):
        return [
            {
                'title': '基本资料',
                'perm': self.get_model_perm(SingleSet,'view'),
                'icon': 'fa fa-bars',
                'menus': (
                    {
                        'title': '项目人员资料',
                        'icon': 'fa fa-vcard',
                        'url': self.get_model_url(SingleSet, 'changelist'),
                        'perm': self.get_model_perm(SingleSet, 'view'),
                    },)
            },
        ]

效果为

2.菜单排序

菜单排序为get_nav_menu,还需要修改每一个app的apps.py文件

    @filter_hook
    def get_nav_menu(self):
        site_menu = list(self.get_site_menu() or [])
        had_urls = []

        def get_url(menu, had_urls):
            if 'url' in menu:
                had_urls.append(menu['url'])
            if 'menus' in menu:
                for m in menu['menus']:
                    get_url(m, had_urls)

        get_url({'menus': site_menu}, had_urls)

        nav_menu = OrderedDict()

        menus_ = self.admin_site._registry.items()
        for model, model_admin in menus_:
            if getattr(model_admin, 'hidden_menu', False):
                continue
            app_label = model._meta.app_label
            app_icon = None
            model_dict = {
                'title': smart_text(capfirst(model._meta.verbose_name_plural)),
                'url': self.get_model_url(model, "changelist"),
                'icon': self.get_model_icon(model),
                'perm': self.get_model_perm(model, 'view'),
                'order': model_admin.order,
            }
            if model_dict['url'] in had_urls:
                continue

            app_key = "app:%s" % app_label
            if app_key in nav_menu:
                nav_menu[app_key]['menus'].append(model_dict)
            else:
                # Find app title
                app_title = smart_text(app_label.title())
                if app_label.lower() in self.apps_label_title:
                    app_title = self.apps_label_title[app_label.lower()]
                else:
                    appL = apps.get_app_config(app_label)
                    app_title = smart_text(apps.get_app_config(app_label).verbose_name)
                    # added by Fiona for menu ordering
                    if app_label == "auth":
                        app_index = len(menus_) - 1
                    elif app_label == "xadmin":
                        app_index = len(menus_) - 2
                    else:
                        app_index = appL.orderIndex_
                # find app icon
                if app_label.lower() in self.apps_icons:
                    app_icon = self.apps_icons[app_label.lower()]
                nav_menu[app_key] = {
                    "orderIndex": app_index,
                    'title': app_title,
                    'menus': [model_dict],
                }
            app_menu = nav_menu[app_key]
            if app_icon:
                app_menu['first_icon'] = app_icon
            elif ('first_icon' not in app_menu or
                  app_menu['first_icon'] == self.default_model_icon) and model_dict.get('icon'):
                app_menu['first_icon'] = model_dict['icon']

            if 'first_url' not in app_menu and model_dict.get('url'):
                app_menu['first_url'] = model_dict['url']

        for menu in nav_menu.values():
            menu['menus'].sort(key=sortkeypicker(['order', 'title']))

        nav_menu = list(nav_menu.values())
        #nav_menu.sort(key=lambda x: x['title'])
        #左侧菜单自定义排序新增
        nav_menu.sort(key=sortkeypicker(['orderIndex']))
        site_menu.extend(nav_menu)
        return site_menu

apps.py文件中添加orderIndex_ = 3,orderIndex_为一级菜单默认排序序号。此排序是没有get_site_menu的情况下,get_site_menu的内容在所有排序最上层。

from django.apps import AppConfig


class UserProfileConfig(AppConfig):
    name = 'userProfile'
    verbose_name = u'人事管理'
    orderIndex_ = 3

参考文章:https://blog.csdn.net/weixin_41622043/article/details/96330570

Guess you like

Origin blog.csdn.net/qq_15028721/article/details/108823038