Django权限混合CBV,如何申请“发布博客”方法

时间:2015-12-15 22:18:20

标签: django permissions mixins python-decorators class-based-views

我是Django的新手,我使用的是Django的CBV。目前我正在通过使用LoginRequiredMixin,PermissionRequiredMixin等将权限应用于我的项目。在视图上它的工作完美!但是,我有一些基于函数的方法。

例如,通过网址发布博客

  

/博客/ 1 /发布

必然会

url(r"^(?P<pk>[0-9]+)/publish/$", views.publish, name="publish"),

调用

def publish(request, pk):
    if request.method == "GET":
        Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
    return HttpResponseRedirect("/blogs/" + pk)

由于我使用基于类的视图,因此可以使用mixins保护我的所有视图。在基于功能的基础上,我不确定保护这些的适当方法是什么。

我是否应该将这些基于函数的方法转换为类或 我应该创建方法装饰器来检查这些场合的权限吗?还是有其他方法更方便吗?

2 个答案:

答案 0 :(得分:2)

Django有装饰器,如login_requiredpermission_required装饰器,您可以将它们用于基于功能的视图。这些实际上在Django中比在Django 1.9中添加的CBV的混合物长得多。

@permission_required('myapp.can_publish')
def publish(request, pk):
    if request.method == "GET":
        Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
    return HttpResponseRedirect("/blogs/" + pk)

顺便说一句,通常最佳做法是使用POST请求来执行更改发布日期等操作。

答案 1 :(得分:1)

太可行了:

  1. 创建CBV用于发布和覆盖post方法:

    class PublishView(UpdateView):
    
        model = Blog
    
        def post(self, request, *args, **kwargs):
            pk = self.kwargs.get('pk', None)
            Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
            return HttpResponseRedirect("/blogs/" + pk)
    
    1. 在博客UpdateView中定义发布为staticmethod:
  2.      class BlogUpdateView(UpdateView):
    
                model = Blog
    
                @staticmethod
                def publish(request, pk):
                   if request.method == "GET":
                   Blog.objects.filter(pk=pk).update(publish_date=datetime.datetime.now())
                   return HttpResponseRedirect("/blogs/" + pk)
    

     在网址中,您可以直接访问您的函数发布方法

    url(r"^(?P<pk>[0-9]+)/publish/$", views.BlogUpdateView.publish, name="publish"),