我正在尝试使用Django中的管理员登录机制,并重定向到请求的页面,我正在尝试重定向到发布的网址,而不是下一个参数所代表的网址。我显然不理解某些东西,因为当我单步执行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)),
登录模板是管理站点中包含的登录模板,无需更改。
答案 0 :(得分:2)
django auth app有一个登录视图,你应该直接在你的url模式中明确地包含它。
(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
有关详细信息,请参阅docs on auth views。您无需选择/accounts/login/
作为登录网址。我只想说明这个视图与管理员应用程序是分开的。
在您的设置中更新LOGIN_URL='/accounts/login/'
,然后在使用login_required装饰器时不必使用login_url
参数。
目前,/sdc/admin/login/
由管理员应用处理,但管理员应用确实为此提供了登录视图。如果单步执行代码,则可以看到AdminSite.login
方法处理请求。此方法将REDIRECT_FIELD_NAME
(在您的情况下为'next')设置为请求路径,然后调用auth登录视图。