1

我正在尝试使用 Django 中的管理员登录机制,并重定向到请求的页面,我得到一个 404,因为它试图重定向到发布的 url,而不是下一个参数表示的 url。我显然不明白什么,因为当我单步执行 contrib.auth.login 视图时,它根本没有解析下一个参数。例如,我有以下视图(网站的主页)

@login_required(login_url='/sdc/admin/login')
def cb_index(request):
    #snip
    return render_to_response('chargeback_base.html', variables)

因此,当我输入 cb_index 视图的 URL /sdc/chargeback/ 时,它会正确重定向到登录页面,下一个变量设置为 /sdc/chargeback/,如下所示。

http://localhost:8000/sdc/admin/login/?next=/sdc/chargeback/

但是,来自 contrib.auth.views 的默认登录视图使用完整的 url 作为 redirect_to 而不是下一个参数,所以我总是得到 404 而不是被重定向到下一个 url。我可以通过添加来修复它

redirect_to = request.GET.get('next','')

到视图的 POST 部分,但我认为这应该是内置的功能,但它不起作用。更重要的是,由于这是对基本视图的编辑,我必须记住每次更新时都要修复这个问题,我不想这样做。我不明白什么?

编辑:登录网址遵循管理网站网址

url(r'^sdc/admin/', include(admin.site.urls)),

登录模板是管理站点中包含的登录模板,没有更改。

4

1 回答 1

2

django auth 应用程序有一个登录视图,您应该直接将其明确包含在您的 url 模式中。

(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),

有关更多信息,请参阅有关 auth 视图的文档。您无需选择/accounts/login/作为您的登录网址。我只是想明确一点,此视图与管理应用程序是分开的。

更新您的设置,然后您在使用 login_required 装饰器时LOGIN_URL='/accounts/login/'不必使用该参数。login_url

目前,/sdc/admin/login/由管理应用程序处理,但管理应用程序确实为此提供了登录视图。如果您单步执行代码,您可以看到该AdminSite.login方法处理了请求。此方法将REDIRECT_FIELD_NAME(在您的情况下为“下一个”)设置为请求路径,然后调用身份验证登录视图。

于 2013-04-24T23:16:44.197 回答