1. 程式人生 > >Djangod的Rbac介紹3

Djangod的Rbac介紹3

今天的部落格主要是記錄一下如何實現左側選單,這裡我們想實現的效果就是,如果使用者有檢視使用者的許可權,則顯示檢視使用者的左側選單,如果使用者有檢視角色的許可權,則顯示檢視角色的左側選單,如果兩者都有,則需要顯示兩個選單

我們先來看下model中我們如何設計的資料庫

from django.db import models

# Create your models here.

class Userinfo(models.Model):
    username = models.CharField(max_length=64)
    uerpwd = models.CharField(max_length=64)
    roles = models.ManyToManyField(to="Role")

    def __str__(self):
        return self.username
    class Meta:
        verbose_name = "使用者表"
        verbose_name_plural = verbose_name

class Role(models.Model):
    title = models.CharField(max_length=64)
    pers = models.ManyToManyField(to="per")


    def __str__(self):
        return self.title
    class Meta:
        verbose_name="角色表"
        verbose_name_plural = verbose_name

class per(models.Model):
    title = models.CharField(max_length=64)
    url = models.CharField(max_length=128)
    action = models.CharField(max_length=32, default="")
    group = models.ForeignKey("PerGroup", default=1)
    def __str__(self):
        return self.title
    class Meta:
        verbose_name = "許可權表"
        verbose_name_plural = verbose_name


class PerGroup(models.Model):
    title = models.CharField(max_length=32)

    def __str__(self): return self.title

    class Meta:
        verbose_name = "許可權組"
        verbose_name_plural = verbose_name

  

 

在檢視函式中,我們可以在session中拿到per_dict這個資料,下面的資料就是某個使用者的per_dict的值

這個資料的內容如下

{'1':

'urls': ['/user/', '/user/add/', '/user/edit/(\\d+)', '/user/del/(\\d+)'],
'action': ['list', 'add', 'edit', 'del']},
'2':
{
'urls': ['/role/add/', '/role/', '/role/del/(\\d+)','/role/edit/(\\d+)'],
'action': ['add', 'list', 'del', 'edit']}}

 

我們需要拿到action為list的許可權,並拿到這個這個許可權的titile和url,程式碼如下

 

先獲取per_group的列表

  group_list = []
    for k,v in request.session["per_dict"].items():
        if "list" in v["action"]:
            group_list.append(k)

  

通過per_group的列表,獲取title和url,然後渲染到前端就可以了

    menu_tile = []
    print(group_list,"ddddddddddddddddddddddd")
    from django.db.models import Q
    for i in group_list:
        name = rbacmodels.PerGroup.objects.get(id=int(i)).title

        url = rbacmodels.PerGroup.objects.get(id=int(i)).per_set.filter(Q(action__exact="list")).first().url
        temp = [name,url]
        menu_tile.append(temp)

  

return render(request,"rbac_roles.html",{"action":action,"role_list":role_list,"menu_tile":menu_tile})

  

最後在html檔案中渲染就可以了

<div class="menu">
    {% for menu in menu_tile %}
    <p class="ment_btn"><a href="{{ menu.1 }}">{{ menu.0 }}</a></p>
    {% endfor %}
</div>