如果他没有获得许可,CBV如何正确地重定向用户?

时间:2017-11-27 11:25:05

标签: python django python-2.7 django-views django-1.11

我想将用户重定向到网址(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 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;
    };

    $("#user-modal").on("submit", ".user-edit-form", saveForm);
});

1 个答案:

答案 0 :(得分:0)

您滥用redirect_field_name。它应该是存储下一个URL的字段的名称,默认为字符串'next'。除非你有充分的理由改变它,否则你应该删除该行并让Django使用默认值。

使用login_url配置您的视图以重定向到信息中心。

class UserEditView(PermissionRequiredMixin, UpdateView):
    login_url = reverse_lazy('dashboard')