Как поднять PermissionDenied Redirect на другую страницу, используя CBV? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть модель с моими разрешениями, и, по моему мнению, с использованием CBV (generic.CreateView) или (generic.DetailView), если зарегистрированный пользователь имеет разрешения, он может получить доступ к представлению, если не имеет доступа к странице. Запрещено 403 показа.

Но если у пользователя нет разрешения на это представление, я хочу вызвать исключение PermissionDenied и перенаправить на определенную страницу для этой ошибки.

Мой взгляд:

class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView)

   permission required = 'can_create_job'
   model = Job
   fields = ['name', 'description', 'salary']
   success_url = reversy_lazy('job_list)
   context_object_name = 'object_name'

Кто-нибудь может мне помочь? Спасибо

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Прежде всего, вы не можете сделать и перенаправление и повышение 404 исключение .

То есть, вы можете либо перенаправить на какую-либо страницу, если у пользователя нет разрешения или вызвать исключение.

Случай 1: поднять исключение
чтобы вызвать исключение, вы должны добавить raise_exception = True в вашем классе просмотра как,

class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView):
    permission_required = 'can_create_job'
    model = Job
    fields = ['name', 'description', 'salary']
    success_url = reversy_lazy('job_list')
    context_object_name = 'object_name'
    <b>raise_exception = True # Change is here</b>

Случай 2: перенаправление на определенную страницу
Установите login_url на ваш взгляд,

class AddJob(LoginRequiredMixin, PermissionRequiredMixin, generic.CreateView):
    permission_required = 'can_create_job'
    model = Job
    fields = ['name', 'description', 'salary']
    success_url = reversy_lazy('job_list')
    context_object_name = 'object_name'
    <b>login_url = '/path/to/specific/page'</b>



Что произойдет, если вы установите login_url и raise_exception?

Класс AccessMixin имеет метод handle_no_permission(), который вызывается для обработки этого условия.

Исходный код

def handle_no_permission(self):
    <b>if self.raise_exception:
        raise PermissionDenied(self.get_permission_denied_message())</b>
    return redirect_to_login(self.request.get_full_path(), self.get_login_url(), self.get_redirect_field_name())

Здесь вы можете увидеть, если вы установите raise_exception = True, Джанго не будет учитывать login_url

0 голосов
/ 31 августа 2018

Что вы можете сделать, это добавить raise_exception = True для просмотра класса, это повысит PermissionDenied, то есть ответ с 403 (Запрещено) статусом http. Смотри https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.mixins.AccessMixin.raise_exception

Также, если вы хотите показать свою собственную страницу 403, вы можете создать шаблон 403.html, django будет использовать его при возврате 403. См. https://docs.djangoproject.com/en/dev/ref/views/#the-403-http-forbidden-view

...