登录和重定向

xRo*_*bot 3 django django-forms django-login

这是我的登录视图:

def login(request):

    redirect_to = request.REQUEST.get("next")
    if request.method == 'POST': 

        formL = LoginForm(data=request.POST)           
        if formL.is_valid(): 

            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = "/blogs/"

            from django.contrib.auth import login
            login(request, formL.get_user())
            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()
            return HttpResponseRedirect(redirect_to)

    else:

    formL = LoginForm(request)                 

request.session.set_test_cookie()  

return render_to_response('blogs.html', {
    'formL': formL, }, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

login = never_cache(登录)

例如,当我去example.com/myblog/时,我已经重定向到example.com/accounts/login/?next=/myblog/

但是当我插入用户和psw登录时,我已经重定向到/ blogs /而不是/ myblog /

为什么?

编辑:request.REQUEST.get('next','')总是返回''

我不知道为什么: -

Dav*_*cic 8

您的登录表单模板如何?

你的问题

您没有将redirect_to路径发送到模板,您应该这样做.您的回报应如下所示:

return render_to_response('blogs.html', {
        'formL': formL,
        'next': redirect_to,
    }, context_instance=RequestContext(request)
)
Run Code Online (Sandbox Code Playgroud)

登录表单操作应如下所示:

<form action="/your_login_url/?next={{ next }}" method="post">
Run Code Online (Sandbox Code Playgroud)

因此,当您转到/myblog/重定向时/your_login_url/?next=/myblog/,登录视图将呈现登录表单并替换next登录表单操作属性中的变量,因此它看起来像/your_login_url/?next=/myblog/您提交表单时,您将登录并重定向到/myblog/(if request.method == 'POST':执行后的内容) .

在您的视图中,redirect_to = request.REQUEST.get("next")只有GET登录页面时POST才能正常工作,但是当您使用它时next,GET中没有设置变量.

另请注意

登录视图不应呈现您的博客,博客视图应该这样做.

这是Django的返回的响应的样子,记下它说行redirect_field_name: redirect_to,,redirect_field_name具有值next默认.

return render_to_response(template_name, {
    'form': form,
    redirect_field_name: redirect_to,
    'site': current_site,
    'site_name': current_site.name,
}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

并且,您似乎只为默认重定向覆盖登录视图?这不对恕我直言.通过设置LOGIN_REDIRECT_URL,在settings.py中设置登录重定向的默认位置的正确位置.

但是,既然您正在编写自己的登录视图,为什么不使用django中的那个作为骨架,然后根据需要展开它.