Django实战-信息资讯-轮播图管理

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

对不同应用的管理,可以将用户分为不同类别的组,这样就能便于不同应用的 model 的数据管理。

request.user.has_perms('<app_name>.<codename>')

判断是否拥有某个权限。权限参数是一个字符串,格式是app_name.codename。判断user.permissions下有没有这个权限:有, 返回True;没有, 判断所属组下有没有这个权限。

content_type = ContentType.objects.get_for_model(model)
permissions = Permission.objects.filter(content_type=content_type)

① 自定义权限限定装饰器

from django.contrib.auth.models import Permission, ContentType
from django.http import Http404

如果拥有,那么就可以进入到指定的视图函数中,如果不拥有,那么就会报一个404错误。

def permission_required(model):
    def decorator(viewfunc):
        @wraps(viewfunc)
        def _wrapper(request, *args, **kwargs):
            content_type = ContentType.objects.get_for_model(model)
            permissions = Permission.objects.filter(content_type=content_type)
            codenames = [content_type.app_label + "." + permission.codename for permission in permissions]
            # result = request.user.has_perms(permissions)
            # result = request.user.has_perms(['news.add_news', 'news.change_news', 'news.delete_news'])
            # has_perms只能采用字符串的形式判断
            # 字符串的形式为 app_label.codename
            result = request.user.has_perms(codenames)
            if result:
                return viewfunc(request, *args, **kwargs)
            else:
                raise Http404()
        return _wrapper
    return decorator

② 轮播图管理页

@permission_required(Banner)
def banners(request):
    return render(request, 'cms/banners.html')

③ 轮播图列表

@permission_required(Banner)
def banner_list(request):
    # values 返回的还是QuerySet
    # 只不过在QuerySet中, 有的不是模型了,而是字典
    banners = list(Banner.objects.all().values())
    return restful.result(data={"banners": banners })

④ 添加轮播图

@permission_required(Banner)
def add_banner(request):
    form = AddBannerForm(request.POST)
    if form.is_valid():
        image_url = form.cleaned_data.get('image_url')
        link_to = form.cleaned_data.get('link_to')
        priority = form.cleaned_data.get('priority')
        banner = Banner.objects.create(image_url=image_url, link_to=link_to, priority=priority)
        return restful.result(data={"banner_id": banner.pk})
    else:
        return restful.params_error(message=form.get_error())

⑤ 删除轮播图

@permission_required(Banner)
def delete_banner(request):
    banner_id = request.POST.get('banner_id')
    Banner.objects.filter(pk=banner_id).delete()
    return restful.ok()

⑥ 修改轮播图

@permission_required(Banner)
def edit_banner(request):
    form = EditBannerForm(request.POST)
    if form.is_valid():
        pk = form.cleaned_data.get('pk')
        image_url = form.cleaned_data.get('image_url')
        link_to = form.cleaned_data.get('link_to')
        priority = form.cleaned_data.get('priority')
        Banner.objects.filter(pk=pk).update(image_url=image_url, link_to=link_to, priority=priority)
        return restful.ok()
    else:
        return restful.params_error(message=form.get_error())

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券