Django--CRM--菜單展現, 刪除合併, 權限展現

 一 . 菜單展現

  

 

  

  

  

 

二 . 合併刪除

  咱們能夠把全部的刪除都合併成一個函數這樣就會減小不少的代碼.html

  思路: 在url裏面須要傳兩個參數,一個是要刪的id 一個是名字前端

  

  

 

  

 

  

三 .權限展現

   咱們要實現兩個功能

    1. 咱們點擊菜單管理的一級菜單,展現所屬他的全部權限.數據庫

    2. 讓權限按照一級菜單的分類進行展現.django

    3. 點擊權限管理的二級菜單,讓所屬它的功能進行展開與閉合後端

       

  咱們要想讓權限按照一級菜單的分類進行展現的話,須要把二級菜單的功能放到二級菜單的children裏面,這樣展現起來就不會亂了順序.api

  

from django.shortcuts import render, redirect, reverse from rbac import models from rbac.form import RoleForm, MenuForm from django.db.models import Q # Create your views here.

def role_list(request): all_role = models.Role.objects.all() return render(request, 'rbac/role_list.html', {'all_role': all_role}) def role_change(request, edit_id=None): obj = models.Role.objects.filter(pk=edit_id).first() if edit_id: form_obj = RoleForm(instance=obj) else: form_obj = RoleForm() if request.method == 'POST': form_obj = RoleForm(request.POST, instance=obj) if form_obj.is_valid(): form_obj.save() return redirect('role_list') return render(request, 'rbac/role_add.html', {'form_obj': form_obj}) # 全部的刪除均可以用下面的delete函數 # def role_del(request, del_id): # models.Role.objects.filter(pk=del_id).delete() # return redirect('role_list')

def menu_list(request): # 這種獲取到的是all(),到前段展現的時候就須要.字段名,若是隻直接篩選完的
    all_menu = models.Menu.objects.all() mid = request.GET.get('mid') permission_id = models.Permission.objects.filter(menu_id=mid).first().id # print(permission_id)
    if mid: # Q 是爲了讓二級菜單和隸屬於他的功能所有展現,要否則只會展現一種
        all_permission = models.Permission.objects.filter(Q(parent_id=permission_id) | Q(menu_id=mid)).values('id', 'parent_id', 'title', 'url', 'name', 'menu__title') else: all_permission = models.Permission.objects.all().values('id', 'parent_id', 'title', 'url', 'name', 'menu__title') permission_dict = {} for i in all_permission: if not i.get('parent_id'): i['children'] = [] permission_dict[i['id']] = i # print(i)
    for i in all_permission: pid = i.get('parent_id') if pid: permission_dict[pid]['children'].append(i) # 這種傳參沒用用modelform的到前段循環展現的時候須要 .字段名字才能夠 {{permission.name}}
    return render(request, 'rbac/menu_list.html', {'mid': mid, 'all_menu': all_menu, 'all_permission': permission_dict.values()}) def menu_change(request, edit_id=None): obj = models.Menu.objects.filter(pk=edit_id).first() form_obj = MenuForm(instance=obj) if edit_id else MenuForm() if request.method == 'POST': form_obj = MenuForm(request.POST, instance=obj) if form_obj.is_valid(): form_obj.save() return redirect('menu_list') # 這種傳參用了modelform的 到前段循環展現的時候,直接{{field}} 就能夠
    return render(request, 'rbac/form.html', {'form_obj': form_obj}) def delete(request, table, del_id): # 用反射的原理,這裏的models是models.py文件
    table_class = getattr(models, table.capitalize()) # 這裏的table_class就至關於models.表名
    table_class.objects.filter(pk=del_id).delete() return redirect(f'{table}_list')
權限展現的視圖函數

 

  前端在循環展現權限的時候, 須要進行兩次循環, 第一次是循環出二級菜單, 第二次循環出二級菜單children裏面的功能,這樣順序纔是咱們想要的app

   下面的效果就是js的點擊事件功能了,點擊添加, 移除類屬性ide

  

  注意:

    

if條件裏面的兩個數據類型不同,不能直接比較,從數據庫中提取的是int類型, 從url中獲取的是str類型,   要把他們兩個變成同一類型, 第一種方法是在後端把url獲取的變成int, 第二種方法就是在前端把int類型加個safe變成字符串

 

 

相關文章
相關標籤/搜索