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','')总是返回''
我不知道为什么: -
您的登录表单模板如何?
你的问题
您没有将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中的那个作为骨架,然后根据需要展开它.