不了解Django管理员登录

时间:2013-04-24 18:24:18

标签: django redirect django-admin

我正在尝试使用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)),

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

1 个答案:

答案 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登录视图。