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
当点击用户信息之后的某个标签之后,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:\Download\qq_download\teacher_huatu_download\s20py\Django\day78\上一次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