雙層菜單細節完善

.Queryset數據類型

  1.可切片html

  2.可迭代前端

  3.惰性查詢:爲了節省內存web

    book_list=Book.objects.all()惰性查詢,先取出queryset可是不會馬上執行sql語句,什麼時 候用何時執行sql

    什麼時候用到查詢集:緩存

      print(book_list)session

      For...app

      切片ide

      If book_listurl

  4.緩存機制(緩存到內存)spa

    book.objects.all()

    簡單的打印queryset不會緩存,執行兩次sql語句

      print(book_list)

      print(book_list)

    正常的會緩存

      For obj in book_list

      For obj in book_list

    執行兩次時,sql之執行一次

    每一個queryset會維持一個緩存空間,

  優勢:一次查詢,屢次使用

二. 緩存量大的問題解決方式:迭代器

Book.objects.all().iterator() #生成器對象  將queryset封裝到生成器中

缺點:只能向下,只能用一次

三. 權限繼續

1.二級菜單默認顯示       

在過濾器中:

 1 @register.inclusion_tag("rbac/menu.html")
 2 def get_menu_styles(request):
 3     permission_menu_dict = request.session.get("permission_menu_dict")
 4     print("permission_menu_dict",permission_menu_dict)
 5     for val in permission_menu_dict.values():
 6         for item in val["children"]:
 7             val["class"]="hide"
 8             ret=re.search("^{}$".format(item["url"]),request.path)
 9             if ret:
10                 val["class"]=""   #爲permission_menu_dict增長一個字段class
11     return {"permission_menu_dict":permission_menu_dict}

在與過濾器對應的menu.html:

 1 <div class="multi-menu">
 2     {% for item in permission_menu_dict.values %}
 3        <div class="item">
 4         <div class="title"><i class="{{ item.menu_icon }}"></i>{{ item.menu_title }}</div>
 5         <div class="body {{ item.class }}">   #爲body添加hide類名
 6               {% for foo in item.children %}
 7                   <a href="{{ foo.url }}">{{ foo.title }}</a>
 8               {% endfor %}
 9         </div>
10        </div>
11     {% endfor %}
12 </div>

2.沒有權限的按鈕不顯示

作法一:給按鈕的顯示加一個判斷

1 {% if "/customer/add/" in request.session.permission_list %}
2 <a class="btn btn-default" href="/customer/add/">
3     <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客戶
4 </a>
5 {% endif %}

缺點:全部的按鈕都要判斷

作法二:.沒有權限的按鈕不顯示(過濾器版本)

作法封裝到一個過濾器中,避免代碼冗餘,前端在須要的地方調用便可

過濾器部分:

1 @register.filter
2 def has_permission(btn_url,request):
3     permission_names = request.session.get("permission_list")
4     return btn_url in permission_list

前端調用部分:

1 {% load web %}
2 {% if "/customer/add/"|has_permission:request %}
3 <a class="btn btn-default" href="/customer/add/">
4     <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客戶
5 </a>
6 {% endif %}

刪除,編輯部分:

表頭:

1 {% if "/customer/edit/(?P<cid>\d+)/"|has_permission:request %}
2 <th>編輯</th>
3 {% endif %}
4 {% if "/customer/del/(?P<cid>\d+)/"|has_permission:request %}
5 <th>刪除</th>
6 {% endif %}

表內容:

 1 {% if "/customer/edit/(?P<cid>\d+)/"|has_permission:request %}
 2 <td>
 3     <a style="color: #333333;" href="/customer/edit/{{ row.id }}/">
 4         <i class="fa fa-edit" aria-hidden="true"></i></a>
 5 </td>
 6 {% endif %}
 7 {% if "/customer/del/(?P<cid>\d+)/"|has_permission:request %}
 8 <td>
 9     <a style="color: #d9534f;" href="/customer/del/{{ row.id }}/"><i class="fa fa-trash-o"></i></a>
10 </td>
11 {% endif %}

缺點:作法麻煩

作法三:添加一個字段,之後用的時候就不用考慮路徑的正則問題

permision加一個別名字段 name

 

取出來並注入session

1 permission_names=[]
2 for item in permissions:
3     permission_names.append(item["permissions__name"])

過濾器中使用:

1 @register.filter
2 def has_permission(btn_url,request):
3     permission_names=request.session.get("permission_names")
4     print("permission_names",permission_names)
5     return btn_url in permission_names

前端使用:

 1 {% if "customer_edit"|has_permission:request %}
 2 <td>
 3     <a style="color: #333333;" href="/customer/edit/{{ row.id }}/">
 4         <i class="fa fa-edit" aria-hidden="true"></i></a>
 5 </td>
 6 {% endif %}
 7 {% if "customer_del"|has_permission:request %}
 8 <td>
 9     <a style="color: #d9534f;" href="/customer/del/{{ row.id }}/"><i class="fa fa-trash-o"></i></a>
10 </td>
11 {% endif %}
相關文章
相關標籤/搜索