day78 为用户分配角色 为角色分配权限 ajax 字符串拼接

day78 6.22 星期六

权限管理的流程

先传的	user_list	和	role_list

user_list = User表的all 
role_list = Role表的all 

在html页面 角色栏那里 
循环显示 role_list 
判断之后的rid 即点击了的被选中的好似给选中 写法如下:                            <tr {% if role.id|safe == rid %} class="active" {% endif %}>
判断循环的值是否在 之后发送的有选中的值里,有则选中,没有不选 写法如下
 <td><a href="?{% gen_role_url request role.id %}">{{ role.name }}</a></td>
# 拼接的a标签   host/rbac/permission/?uid=3&rid=1  用于判断post? form表单
<td>
{% if role.id in role_id_list %}
<input type="checkbox" name="roles" value="{{ role.id }} " checked>
{% else %} <input type="checkbox" name="roles" value="{{ role.id }} ">
{% endif %}   该开始为没被选中 ,所以显示的是	方形框 没有checked

没有uid的页面

当点击用户信息之后的某个标签之后,a标签刷新网页

html程序如下

{% for user in user_list %}			
<li class= {% if user.id|safe == uid %} 'active' {% endif %}>	
# 1,2,3 == 1/2/3    后端提交的uid = request.GET.get('uid') 然后前端才显示一个发红的点击事件 active  是因为提交了一个uid = {{user.id}} 没用name        
<a href="?uid={{ user.id }}">{{ user.name }}</a>		
</li>				
{% endfor %}							
safe 自定义过滤器方法 为:
def safe(value):
    """
    Marks the value as a string that should not be auto-escaped.
    """		# 确保是个字符串而不是自动转义  不就是字符串吗?又没标签 <h1、、
    return mark_safe(value)		

因为前端提交了uid 后端进行动态处理

if uid:
role_id_list=models.User.objects.get(pk=uid).roles.all().values_list("pk")
#[(1,),(2,)]
role_id_list=[item[0] for item in role_id_list] #[1,2]
if rid:
per_id_list = models.Role.objects.filter(pk=rid).values_list("permissions__pk")
else:
per_id_list=models.User.objects.get(pk=uid).roles.values_list("permissions__pk").distinct()

per_id_list=[item[0] for item in per_id_list]	 # []  列表【1,2】
print("per_id_list",per_id_list)
return locals()

把role_id_list 和 per_id_list = User.(per__pk) 返回给前端 用户的权限

因为用户可以有多个角色,所以,去重一下权限

再把role权限的代码复制过来

rid没有得到值,没发过来,不成立  没有active
<tr {% if role.id|safe == rid %} class="active" {% endif %}>
 <td><a href="?{% gen_role_url request role.id %}">{{ role.name }}</a></td>
<td>		拼接 rid $用 matable的 方法
{% if role.id in role_id_list %}	# 得到了点击的user的role权限 【1,2】
<input type="checkbox" name="roles" value="{{ role.id }} " checked>
{% else %} <input type="checkbox" name="roles" value="{{ role.id }} ">
{% endif %}   该开始为没被选中 ,所以显示的是	方形框 没有checked
自定义标签 拼接

def gen_role_url(request,rid):

也可以使用deepcopy()

     params = request.GET.copy()   # 1
     #区别:1:querydict的某个方法   copy.copy(request.GET)	 __copy__方法
     params._mutable = True
     params['rid'] = rid
     print('自定义标签里的params.urlencode()',params.urlencode())  #自定义标签里的params.urlencode() uid=3&rid=1
     return params.urlencode()

每一个role 所以提交的标签就是 ?uid=3&rid=1

再把方形框 点亮(checked) if role.id in role_id_list

如果点击了 role 因为提交了rid

所以进入代码

if rid:
per_id_list = models.Role.objects.filter(pk=rid).values_list("permissions__pk")
     

per_id_list 就不一样了 传过去的值 是 role等于 pk=rid的 单个权限

而那个是用户的单个权限(但是包括多个角色:所以就是多个角色的多个权限)

到现在因为提交的是a标签的请求,所以都是get请求

并且当 if uid的时候隐藏(hidden)的角色保存可以操作

并且当 if rid的时候隐藏(hidden)的权限保存可以操作

以及ajax里面对 权限的操作就可以完成页面了

把权限 不管是单个角色的权限还是单个用户的权限 赋值给var

var per_id_list = {{ per_id_list }};
$.each(per_id_list,function (i,j) {
    console.log($("[value='"+j+"']")[0]);
    $("#body [value="+j+"']").prop('checked',true);

})

循环,i是序号1,2,3 j是循环列表里的值 [1,3,4]等

通过 "#body [value=" + j(1或者2) + "']" 属性选择器 给加checked选中

prop获得标签 ,添加 ‘checked’ 为tru true 不能为 字符串

上面的等于 $(#body [value= '2'] ) body是 tbody 的大id标签

忘了 最复杂的 ajax 部分了

数据结构如下

数据

$.each(res,function (i,permission) {   #循环之下
var menu_title = permission['menu__title'];
var pk = permission['pk'];			#1-8
var parent_id = permission['parent_id'];	# 为pid none 111 none 555

if (menu_title){		# menu_title  表结构为 老大才有 分别是menu_id 1,2对应的信息管理 和 缴费管理
if('#menu_'+menu_pk.length){		  # 判断是否有内容 这个标签体里面
var s =							#有就给他 添加 子标签 客户列表 
"<tr class='node' id ='per_${pk}'> <td><input name='permission_id' value='${pk}'type='checkbox'>${title}</td></tr>";	# 不会走把?
						
$("#menu_"+menu_pk).parent().append(s)    # 就是 父标签信息管理栏上append 
}else{					 
var s =						# 没有就连父标签 一块添加   
"<tr class='root' id ='menu_${menu_pk}'> <td> ${menu_title}</td></tr>" +
"<tr class='node' id ='per_${pk}'> " +
"<td input name='permission_id' id ='${pk}' type='checkbox'>${title}</td></tr>";
$("#body").append(s);		# 添加到tbody里 信息管理 客户列表
}
}else{						# else 承接 if(menu_title)添加到子标签 后面  一个父标签跟了许多个子标签   没有menu_title 的6个值  第一个else因该是处理多个重复的  menu_title = 1 
var s =
"<td input name='permission_id' value='${pk}'type='checkbox'>${title}</td>";
$("#per_"+parent_id).append(s);		# 承接上面id ='per_${pk}' 添加客户 编辑客户。。。   
}
})								

三级菜单

![上一次pk 后一次根据per_append](E:Downloadqq_download eacher_huatu_downloads20pyDjangoday78上一次pk 后一次根据per_append.png)

每一次刷新 因为是get 请求,所以都会走ajax吗

$.ajax({
    url:'/rbac/permissions_tree/',
    type:'get',		
def permissions_tree(request):
    permissions=Permission.objects.values("pk","title","url","menu__title","menu__pk","parent_id")
    return JsonResponse(list(permissions),safe=False)	# 生成json数据发过去,内部解释器解析一下  	
    print("permissions",permissions)	#permissions <QuerySet [{'pk': 1, 'title': '客户列表', 'url': '/customer/list/', 'menu__title': '信息管理', 'menu__pk': 1, 'parent_id': None}, {'pk': 2, 'title': '添加客户', 'url': '/customer/add/', 'menu__title': None, 'menu__pk': None, 'parent_id': 1}, {'pk': 3, 'title': '编辑客户', 'url': '/customer/edit/(?P<cid>\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 1}, {'pk': 4, 'title': '删除客户', 'url': '/customer/del/(?P<cid>\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 1}, {'pk': 5, 'title': '缴费列表', 'url': '/payment/list/', 'menu__title': '信息管理', 'menu__pk': 1, 'parent_id': None}, {'pk': 6, 'title': '添加缴费记录', 'url': '/payment/add/', 'menu__title': None, 'menu__pk': None, 'parent_id': 5}, {'pk': 7, 'title': '编辑缴费记录', 'url': '/payment/edit/(?P<pid>\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 5}, {'pk': 8, 'title': '删除缴费记录', 'url': '/payment/del/(?P<pid>\d+)/', 'menu__title': None, 'menu__pk': None, 'parent_id': 5}]>

当post请求时

即 两个保存form提交数据 时

<button type="submit" class="right btn btn-success btn-xs" style="padding: 2px 8px;margin: -8px">
    <i class="fa fa-save" aria-hidden="true"> </i>保存
</button>

<button class="right btn btn-success btn-xs" style="padding: 2px 8px ; margin: -3px;">
<i class="fa fa-save" aria-hidden="true"></i>保存
</button>

走如下函数

 为用户更改角色 :找到特定的user 改权限 
 user=models.User.objects.filter(id=uid)

 if request.method=="POST" and request.POST.get('postType')== 'role':
        print(request.POST.getlist("roles"))	
#  <input type="checkbox" name="roles" value="{{ role.id }} " checked>

        l=request.POST.getlist("roles") 	 #[2,3]
        user.first().roles.set(l)			# 保存更新 user

 为角色更改权限 : 找到特定的role 改权限
 if request.method=="POST" and request.POST.get('postType')== 'permission':
        print(request.POST.getlist("permission_id"))  #permission_id:[1,2,3,4]
        l=request.POST.getlist("permission_id")  #[2,3]
        models.Role.objects.filter(pk=rid).first().permissions.set(l)
        						# 保存更新到 permission  

原文地址:https://www.cnblogs.com/Doner/p/11069999.html