@nurzhannogerbek

Как правильно сделать переадресацию пользователя, если у него нет права доступа к вью?

Здравствуйте! Помогите пожалуйста разобраться.

Есть Class Based View в котором указан permission_required. Вопрос у меня следующий. Как переадресовать пользователя на определенный, указанный url (к примеру reverse_lazy('dashboard')), если у пользователя нет прав на данную вью?

views.py:
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.urlresolvers import reverse_lazy

class UserEditView(PermissionRequiredMixin, UpdateView):
    template_name = 'users/edit_user.html'
    form_class = UserEditForm
    model = User
    permission_required = ('auth.change_user')
    login_url = None
    redirect_field_name = reverse_lazy('dashboard')


В консоли выводятся следующие логи:
LevelName: WARNING | Message: Not Found: /accounts/login/
LevelName: WARNING | Message: "GET /accounts/login/?/=/user/50/edit/ HTTP/1.1" 404 2838


После этого я попробовал в settings.py добавить: LOGIN_URL = reverse_lazy('administration_login'). В таком случаи к консоле уже выводятся следующие логи (но при этом переадресация не произошла):
LevelName: INFO | Message: "POST /user/50/edit/ HTTP/1.1" 302 0
LevelName: INFO | Message: "GET /login/?/=/user/50/edit/ HTTP/1.1" 302 0
LevelName: INFO | Message: "GET / HTTP/1.1" 200 2427


JS:
$(function () {
    var loadForm = function () {
        var btn = $(this);
        $.ajax({
            url: btn.attr("data-url"),
            type: 'get',
            dataType: 'json',
            beforeSend: function () {
                $("#user-modal").modal("show");
            },
            success: function (data) {
                $("#user-modal .modal-content").html(data.html_form);
            }
        });
    };
    var saveForm = function () {
        var form = $(this);
        $.ajax({
            url: form.attr("action"),
            data: form.serialize(),
            type: form.attr("method"),
            dataType: 'json',
            success: function (data) {
                if (data.form_is_valid) {
                    $("#users").html(data.html_users);
                    $("#user-modal").modal("hide");
                }
                else {
                    $("#user-modal .modal-content").html(data.html_form);
                    $("#user-errors").fadeIn("slow");
                    var error_message = "</br>";
                    var json_string = JSON.stringify(data.form_errors);
                    var json_object = jQuery.parseJSON(json_string);
                    $.each(json_object, function(key, value){
                        for (var i = 0; i < value.length; i++) {
                            error_message += value[i] + "</br>";
                        }
                    });
                    $("#user-errors .error-description").html(error_message);
                    setTimeout(function() {$("#user-errors").fadeOut("slow");}, 10000);
                }
            },
            error: function (xhr, ajaxOptions, thrownError) {
                $("#user-errors").fadeIn("slow")
                $("#user-errors .error-description").html(thrownError);
                setTimeout(function() {$("#user-errors").fadeOut("slow");}, 10000);
            },
            cache: false,
            contentType: false,
            processData: false,
        });
        return false;
    };

    $("#users").on("click", ".user-edit-btn", loadForm);
    $("#user-modal").on("submit", ".user-edit-form", saveForm);
});
  • Вопрос задан
  • 1275 просмотров
Решения вопроса 1
Можно переопределить немного и получить, что-то такое.
from django.shortcuts import redirect


class RedirectPermissionRequiredMixin(PermissionRequiredMixin,):
    login_url = reverse_lazy('dashboard')

    def handle_no_permission(self):
        return redirect(self.get_login_url())

# и примешать вместо PermissionRequiredMixin
class UserEditView(RedirectPermissionRequiredMixin, UpdateView):
    template_name = 'users/edit_user.html'
    form_class = UserEditForm
    model = User
    permission_required = ('auth.change_user')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы