Как использовать allow_required декораторы в представлениях на основе классов django - PullRequest
145 голосов
/ 20 мая 2011

У меня возникли проблемы с пониманием того, как работают новые CBV. Мой вопрос заключается в следующем: мне нужно требовать входа во все представления, а в некоторых из них - определенные разрешения. В функциональных представлениях я делаю это с помощью @permission_required () и атрибута login_required в представлении, но я не знаю, как это сделать в новых представлениях. Есть ли какой-то раздел в документации Django, объясняющий это? Я ничего не нашел. Что не так в моем коде?

Я пытался использовать @method_decorator, но он отвечает " TypeError в / space / prueba / _wrapped_view () принимает как минимум 1 аргумент (задано 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

Ответы [ 11 ]

0 голосов
/ 28 июля 2015

Если вы делаете проект, который требует различных тестов разрешений, вы можете наследовать этот класс.

...