如何在基于Django类的视图上使用权限所需的装饰器

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我很难理解新的CBV是如何工作的。我的问题是,我需要在所有视图中登录,在其中一些视图中需要特定的权限。在基于函数的视图中,我使用@Permission来执行该操作。_必需()和登录_视图中需要的属性,但我不知道如何在新视图上执行此操作。Django文档中有解释这一点的部分吗?我什么都没发现。我的代码有什么问题?

我尝试使用@方法_装潢师,但它回答:“TypeError at/space/prueba/_包好_view()至少接受一个参数(0给定)

这是代码(GPL):

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required

class ViewSpaceIndex(DetailView):

    """
    Show the index page of a space. Get various extra contexts to get the
    information for that space.

    The get_object method searches in the user 'spaces' field if the current
    space is allowed, if not, he is redirected to a 'nor allowed' page. 
    """
    context_object_name = 'get_place'
    template_name = 'spaces/space_index.html'

    @method_decorator(login_required)
    def get_object(self):
        space_name = self.kwargs['space_name']

        for i in self.request.user.profile.spaces.all():
            if i.url == space_name:
                return get_object_or_404(Space, url = space_name)

        self.template_name = 'not_allowed.html'
        return get_object_or_404(Space, url = space_name)

    # Get extra context data
    def get_context_data(self, **kwargs):
        context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
        place = get_object_or_404(Space, url=self.kwargs['space_name'])
        context['entities'] = Entity.objects.filter(space=place.id)
        context['documents'] = Document.objects.filter(space=place.id)
        context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
        context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
        return context
提问于
用户回答回答于

中列出了一些策略。CBV文档:

  1. urls.py,例如,login_required(ViewSpaceIndex.as_view(..))
  2. 装饰你的CBVdispatch方法的method_decorator例如, 从django.utils.Deconator导入方法_装饰方法_装潢师(登录)_必需的,名称=‘分派’)类ViewSpaceIndex(TemplatView):模板_名称=‘sec.html’ 在Django 1.9之前你不能使用method_decorator在类中,所以必须重写dispatch方法: 类ViewSpaceIndex(TemplatView):@Method_装潢师(登录)_需要)调度(自我,*ARGS,**返回超级(ViewSpaceIndex,Self).调度(*ARGS,**(Kwargs)
  3. 使用类似于django.contrib.auth.Miins.LoginRequiredMixin可以在Django 1.9+中找到,并在这里的其他答案中做了很好的概述。

你得到一个TypeError在文档中解释:

注:方法_装潢工通行证*ARGS和**kwargs作为类上修饰方法的参数。如果您的方法不接受一组兼容的参数,它将引发TypeError异常。

用户回答回答于

下面是我的方法,我创建了一个受保护的混合体(它保存在我的Mixin库中):

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

class LoginRequiredMixin(object):
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

无论何时,只要想要保护视图,只需添加适当的混合器:

class SomeProtectedViewView(LoginRequiredMixin, TemplateView):
    template_name = 'index.html'

扫码关注云+社区