如果你看了上一章的默认权限,那么,下面看起来就比较容易了。
下面Alter是我的Login应用的一个model,如下:
from django.db import models
class Alter(models.Model):
pass
这个里面确实啥都没写,就是为了自定义创建权限用的。
这里就直接贴核心代码:
def admin_view(request):
'''
为管理员注册,并赋予权限
'''
username = request.POST['username']
password = request.POST['password']
user = User.objects.create_user(username=username, password=password)
# user.has_perm('Login.change_alter') #这是用来缓存权限的
try:
#这里是创建自定义权限,供下面使用; 注意这里只能运行一次,否则报错UNIQUE
content_type = ContentType.objects.get_for_model(Alter)
permission = Permission.objects.create(codename='can_set_alter',content_type=content_type)
#上面的codenmae的值可以自己命名,下面的是调用Django默认的。
permission2 = Permission.objects.get(codename='change_alter')
except Exception as e:
if 'UNIQUE constraint' in str(e): #做一个明确的异常处理
permission = Permission.objects.get(codename='cus_alter')
permission2 = Permission.objects.get(codename='change_alter')
else:
return render(request, 'index.html',{'error':'未知错误,请输入正确的语法!'})
user.user_permissions.add(permission) # 为管理员添加权限
user.user_permissions.add(permission2)
print('管理员注册成功!')
return render(request, 'index.html')
上面的列子添加了自定义权限和默认权限,2个权限。
默认权限:‘add_模型小写名字’;‘change_模型小写名字’;‘delete_模型小写名字’
不用自定义创建。。
‘can_alter’这个权限名字是可以自定义命名的。
下面是对权限的使用:
# 管理员权限
@permission_required('Login.can_set_alter',login_url='index')
def alter_admin(request):
user = User.objects.get(username=request.user)
print(user.get_all_permissions()) #打印user的所有权限。
return HttpResponse('管理员才能看见!')
使用方法就是@permission_required(‘应用名_你的权限名’,login_url=‘urlname名’)
看清楚了,就可以自己尝试了。
删除权限,就是:
# 退出,清除浏览器会话
def logout_view(request):
# 删除指定权限
# permission = Permission.objects.get(codename='can_set_alter')
# request.user.user_permissions.remove(permission)
#删除所有权限
# request.user.user_permissions.clear()
print(request.user.get_all_permissions())
# 清空会话
logout(request)
return HttpResponse('成功退出!')
删除指定权限:
user = User.objects.get(username=request.user)
permission = Permission.objects.get(codename='can_set_alter')
user.user_permissions.remove(permission)
删除user下的所有权限:
user = User.objects.get(username=request.user)
user.user_permissions.clear()
修改权限(覆盖):
user = User.objects.get(username=request.user)
permission = Permission.objects.get(codename='change_alter')
permission2 = Permission.objects.get(codename='add_alter')
user.user_permissions.set([permission2, permission])
# 之前的权限是'can_set_alter'和'change_alter',现在直接是覆盖了变成
# 了'change_alter'和'add_alter'。
本篇完,待续。。。