我是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保护我的所有视图。在基于功能的基础上,我不确定保护这些的适当方法是什么。
我是否应该将这些基于函数的方法转换为类或 我应该创建方法装饰器来检查这些场合的权限吗?还是有其他方法更方便吗?
答案 0 :(得分:2)
Django有装饰器,如login_required
和permission_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)
太可行了:
创建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)
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"),