【问题标题】:How in CBV correctly redirect user if he dont have permission?如果他没有权限,如何在 CBV 中正确重定向用户?
【发布时间】:2018-05-10 15:04:39
【问题描述】:

如果基于类的视图对用户不可用(他没有权限),我想将用户重定向到 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')in 终端我会看到下一个日志,但它不会重定向用户:

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

问题:有人可以说如果用户没有权限,如何正确重定向到自定义 url?

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);
});

【问题讨论】:

  • 请注意,您的 permission_required = ('auth.change_user') 看起来令人困惑。我要么删除括号并使用permission_required = 'auth.change_user',要么添加逗号使其成为一个元组并使用permission_required = ('auth.change_user',)
  • 好的,我按照你说的做了,但是不能解决问题=(你还有什么想法吗?

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


【解决方案1】:

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

使用login_url 配置您的视图以重定向到仪表板。

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

【讨论】:

  • 我尝试了你的代码,但它没有重定向 =( 在日志中我看到这个:LevelName: INFO | Message: "GET /?next=/user/50/edit/ HTTP/1.1" 200 3449。在模板中我看到这个错误:SyntaxError: JSON.parse: unexpected character at line 2 column 1 of the JSON data。我添加我的 JS 代码来发布,你能检查一下请问?
  • 如果您使用的 JavaScript 完全改变了您的问题。我对此无能为力。
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多