Django实战-信息资讯-新增管理员权限

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

在 cms 后台管理中,主要是针对运营管理者权限。在之前的章节中,有提到用户组、用户权限、用户组权限。通过 Group 和 Permission 来对不同用户进行分组和授权。而对于超级管理员,需要采用另外一种验证方式。在类视图中装饰,通过对 request.user.is_superuser,来实现超级管理员权限认证。

username,first_name,last_name,email,password,is_staff(是否具有进入网站管理权限),is_active,is_superuser,last_login,date_joined,这是Django自带的User的基本的信息。

① 超级管理员权限

def superuser_required(viewfunc):
    @wraps(viewfunc)
    def _wrapper(request, *args, **kwargs):
        if request.user.is_superuser:
            return viewfunc(request, *args, **kwargs)
        else:
            raise Http404()
    return _wrapper

Wrapper(装饰器)

# 装饰器:wrapper
# 模板:
def    装饰器名(func):                    #def 与 @之后的函数名称一致   调用函数func与ret=func(*args,**kwargs)内部函数一致
    def wrapper(*args,**kwargs):         #def 与 return 之后的函数名称一致
        ret = func(*args,**kwargs)            
        return ret                       #return ret 与 ret=func(*args,**kwargs)一致
    return wrapper

@装饰器名
def foo():
    pass

② 员工管理

from django.db.models import Q

或的关系:

  代码中使用到了 Q 对象,使用 Q 对象表示的是或的关系,表示只要keyword符合其中任意一个条件即可.

Q(condition1)|Q(condition2),在SQL语句里面就是条件1or条件2

且的关系:

  如果需要表示同时满足多个条件的时候,只需要使用逗号连接即可Q(condition1),Q(condition2),这样表示同时需要满足条件1和条件2

或与且也是可以同时使用,使用方法是Q(condition1),Q(condition2)|Q(condition3),这样就可以表示满足条件1的时候,满足条件2或者条件3…

@superuser_required
def staffs(request):
    context = {
        'staffs': User.objects.filter(Q(is_staff=True)|Q(is_superuser=True))
    }
    return render(request, 'cms/staffs.html', context=context)

③ 新增员工

不能直接对类进行装饰,必须使用 method_decorator,把装饰器当作参数传进去。

from django.utils.decorators import method_decorator
@method_decorator(superuser_required, name='dispatch')
class AddStaffView(View):
    def get(self, request):
        context = {
            'group': Group.objects.all()
        }
        return render(request, 'cms/add_staff.html', context=context)
    def post(self, request):
        telephone = request.POST.get('telephone')
        user = User.objects.get(telephone=telephone)
        user.is_staff = True
        # 得到全部group的id
        group_ids = request.POST.getlist('groups')
        groups = Group.objects.filter(pk__in=group_ids)
        user.groups.set(groups)
        user.save()
        return redirect(reverse('cms:staffs'))

原文发布于微信公众号 - 数据云团(SmartData)

原文发表时间:2019-07-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券