日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Django-simpleui的菜單權限配置,實現無權限不顯示菜單

來源: 責編: 時間:2023-11-20 08:58:04 286觀看
導讀聊聊需求當我們使用Django+simpleui這個框架的時候,如果想實現當某個用戶沒有某個菜單的權限時,他無法在界面上看到這個菜單,在不改變源碼的情況下是無法實現的,換句話說就是無法直接實現根據權限顯示或隱藏菜單。解決辦

聊聊需求

當我們使用Django+simpleui這個框架的時候,如果想實現當某個用戶沒有某個菜單的權限時,他無法在界面上看到這個菜單,在不改變源碼的情況下是無法實現的,換句話說就是無法直接實現根據權限顯示或隱藏菜單。cXa28資訊網——每日最新資訊28at.com

cXa28資訊網——每日最新資訊28at.com

解決辦法-修改simpleui的源代碼

需求:Django-simpleui實現根據用戶權限顯示或者隱藏菜單cXa28資訊網——每日最新資訊28at.com

  • 修改模塊:simpletags.py
  • 路徑:...XXX/venv/Lib/site-packages/simpleui/templatetags/simpletags.py(根據你的項目確定路徑,一般為虛擬環境)

第一步:注釋原有的菜單模塊:cXa28資訊網——每日最新資訊28at.com

# app_list = context.get('app_list')# for app in app_list:#     _models = [#         {#             'name': m.get('name'),#             'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name'))),#             'url': m.get('admin_url'),#             'addUrl': m.get('add_url'),#             'breadcrumbs': [{#                 'name': app.get('name'),#                 'icon': get_icon(app.get('app_label'), app.get('name'))#             }, {#                 'name': m.get('name'),#                 'icon': get_icon(m.get('object_name'), unicode_to_str(m.get('name')))#             }]#         }##         for m in app.get('models')#     ] if app.get('models') else []##     module = {#         'name': app.get('name'),#         'icon': get_icon(app.get('app_label'), app.get('name')),#         'models': _models#     }#     data.append(module)

第二步:讀取SIMPLEUI_CONFIG設置合并菜單處理:cXa28資訊網——每日最新資訊28at.com

... # 如果有menu 就讀取,沒有就調用系統的    key = 'system_keep'    # if config and 'menus' in config:    #     if config.get(key, None):    #         temp = config.get('menus')    #         for i in temp:    #             # 處理面包屑    #             if 'models' in i:    #                 for k in i.get('models'):    #                     k['breadcrumbs'] = [{    #                         'name': i.get('name'),    #                         'icon': i.get('icon')    #                     }, {    #                         'name': k.get('name'),    #                         'icon': k.get('icon')    #                     }]    #             else:    #                 i['breadcrumbs'] = [{    #                     'name': i.get('name'),    #                     'icon': i.get('icon')    #                 }]    #             data.append(i)    #     else:    #         data = config.get('menus')# 修改為    if config and 'menus' in config:            total = config.get('menus')            group_permissions = len(context.request.user.get_group_permissions())            user_permissions = len(context.request.user.get_user_permissions())            if (group_permissions > user_permissions):                user_permissions = context.request.user.get_group_permissions().union(                    context.request.user.get_user_permissions())            else:                user_permissions = context.request.user.get_group_permissions().union(                    context.request.user.get_user_permissions())            for level_one_menu in total:                # 與一級菜單codename比對權限                if 'codename' not in level_one_menu or (                        True in [(True if level_one_menu['codename'] in u_p else False) for u_p in                                 user_permissions]) == False:                    if context.request.user.is_superuser == False:                        continue                # 處理面包屑                if 'models' in level_one_menu:                    del_models = list()                    for level_two_menu in level_one_menu.get('models'):                        if context.request.user.is_superuser:                            pass                        elif 'codename' not in level_two_menu.keys():                            del_models.append(level_two_menu)                            continue                        elif ('codename' not in level_one_menu or 'codename' not in level_two_menu                              or (level_one_menu['codename'] + '.' + level_two_menu[                                    'codename'] not in user_permissions)) and /                                (level_one_menu['codename'] + '.view_' + level_two_menu['codename'] not in user_permissions) /                                and (                                level_one_menu['codename'] + '.add_' + level_two_menu['codename'] not in user_permissions) /                                and (level_one_menu['codename'] + '.change_' + level_two_menu[                            'codename'] not in user_permissions) /                                and (level_one_menu['codename'] + '.delete_' + level_two_menu[                            'codename'] not in user_permissions) /                                and level_two_menu['codename'] not in user_permissions:                            del_models.append(level_two_menu)                            continue                        level_two_menu['breadcrumbs'] = [{                            'name': level_one_menu.get('name'),                            'icon': level_one_menu.get('icon')                        }, {                            'name': level_two_menu.get('name'),                            'icon': level_two_menu.get('icon')                        }]                    for del_m in del_models:                        level_one_menu['models'].remove(del_m)                else:                    level_one_menu['breadcrumbs'] = [{                        'name': level_one_menu.get('name'),                        'icon': level_one_menu.get('icon')                    }]                if len(level_one_menu['models']) > 0:                    data.append(level_one_menu)    else:            data = config.get('menus')...  # 獲取側邊欄排序, 如果設置了就按照設置的內容排序, 留空則表示默認排序以及全部顯示    # if config.get('menu_display') is not None:    #     display_data = list()    #     for _app in data:    #         if _app['name'] not in config.get('menu_display'):    #             continue    #         _app['_weight'] = config.get('menu_display').index(_app['name'])    #         display_data.append(_app)    #     display_data.sort(key=lambda x: x['_weight'])    #     data = display_data# 修改    if config.get('menu_display') is not None:            display_data = list()            for _app in data:                if _app['name'] not in config.get('menu_display'):                    continue                # 處理二級菜單顯示權限                if _app.get('menu_display') is not None:                    display_model = list()                    for _app_m in _app['models']:                        if _app_m['name'] not in _app.get('menu_display'):                            continue                    # 沒有排序邏輯,這里的_weight暫時無效                    _app['_weight'] = config.get('menu_display').index(_app['name'])                    display_data.append(_app)                else:                    display_model = _app['models']                _app['models'] = display_model                _app['_weight'] = config.get('menu_display').index(_app['name'])                display_data.append(_app)                    display_data.sort(key=lambda x: x['_weight'])            data = display_data...

第三步:修改setting.py中的菜單配置。cXa28資訊網——每日最新資訊28at.com

注意:cXa28資訊網——每日最新資訊28at.com

  • 配置中一級菜單中的codename一般為app名字,二級菜單的codename一般為模型中的類名;
  • 只填寫一級菜單的codename或不填一級菜單和二級菜單的codename,表示該只允許superuser查看。
...SIMPLEUI_CONFIG = {    'system_keep': False,  # 關閉系統菜單    'dynamic': True,  # 設置是否開啟動態菜單, 默認為False. 如果開啟, 則會在每次用戶登陸時動態展示菜單內容    'menus': [        # 菜單1        {            'app': 'app_article_ad',            'codename' : 'app_article_ad',            'name': '公眾號文章',            'icon': 'fas fa-user-shield',            'models': [                {                    'name': '文章管理',                    'codename':'job_article',                    'icon': 'fa fa-user',                    'url': 'app_article_ad/job_article/'                },            ]        },        # 菜單2        {            'app': 'app_files',            'codename': 'app_files',            'name': '資源管理',            'icon': 'fas fa-user-shield',            'models': [                {                    'name': '文件管理',                    'codename': 'file',                    'icon': 'fa fa-user',                    'url': '/app_files/file_list'                },            ]        },...

修改cXa28資訊網——每日最新資訊28at.com

if config.get('menu_display') is not None:        display_data = list()        for _app in data:            if _app['name'] not in config.get('menu_display'):                continue            # 處理二級菜單顯示權限            if _app.get('menu_display') is not None:                display_model = list()                for _app_m in _app['models']:                    if _app_m['name'] not in _app.get('menu_display'):                        continue                # 沒有排序邏輯,這里的_weight暫時無效                _app['_weight'] = config.get('menu_display').index(_app['name'])                display_data.append(_app)            else:                display_model = _app['models']            _app['models'] = display_model            _app['_weight'] = config.get('menu_display').index(_app['name'])            display_data.append(_app)            display_data.sort(key=lambda x: x['_weight'])        data = display_data

效果

cXa28資訊網——每日最新資訊28at.com

管理員界面cXa28資訊網——每日最新資訊28at.com

cXa28資訊網——每日最新資訊28at.com

普通用戶界面cXa28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-31011-0.htmlDjango-simpleui的菜單權限配置,實現無權限不顯示菜單

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 金融業務系統:Service Mesh用于安全微服務集成

下一篇: Go vs Rust:文件上傳性能比較

標簽:
  • 熱門焦點
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 分享六款相見恨晚的PPT模版網站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網站旨在為全球Office用戶提供豐富的高品質原創PPT模板、實用文檔、數據圖表及個性化定制服務。優點:OfficePLUS是微軟官方網站,囊括PPT模板、Word模
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事“起猛了,我能看得懂日語了”。“為什么日本人說話我能聽懂?”“中文不像中文,日語不像日語,但是我竟然看懂了”…&hell
  • 華為和江淮汽車合作開發百萬元問界MPV?雙方回應來了

    8月1日消息,郭明錤今天在社交平臺發文稱,華為正在和江淮汽車合作,開發售價在100萬元的問界MPV,預計在2024年第2季度量產,銷量目標為上市首年交付5萬輛。
  • 郭明錤稱華為和江淮汽車合作開發問界MPV,定價100萬左右、計劃明年量產

    8 月 1 日消息,郭明錤今天在 Medium 平臺發布博文,稱華為正在和江淮汽車合作,開發售價在 100 萬元的問界 MPV,預計在 2024 年第 2 季度量產,銷量目標為
Top 主站蜘蛛池模板: 自治县| 千阳县| 丹寨县| 搜索| 侯马市| 象山县| 监利县| 长汀县| 五大连池市| 墨玉县| 香格里拉县| 宁河县| 海南省| 渭源县| 闽侯县| 织金县| 翁牛特旗| 南江县| 高碑店市| 新邵县| 丹棱县| 满城县| 桓台县| 舞阳县| 新龙县| 合江县| 达孜县| 南昌县| 内乡县| 滦平县| 库尔勒市| 客服| 弋阳县| 北安市| 崇礼县| 定远县| 同德县| 津市市| 承德市| 枝江市| 罗江县|