当用户无法正常登录时,Django框架可以轻松处理重定向。但是,此重定向将转到单独的登录页面。我可以将模板设置为与我登录的页面相同,但新页面中不存在任何其他对象。
例如,我有一个显示一堆新闻文章的首页。侧栏上是登录表单。当用户登录但无法进行身份验证时,我希望它返回首页和保留显示的所有新闻文章。截至目前,没有新闻文章出现。
如何解决此问题?任何帮助表示赞赏。
编辑:请记住,我有正在显示的动态内容,我希望它仍然显示!此外,主页面并不是用户可以登录的唯一位置。侧边栏永远不会更改,因此用户可以从网站上的任何页面进行潜在登录,并且该页面上的所有内容完全按照其仍然需要在登录失败时显示。
答案 0 :(得分:6)
您是否想在登录失败时重定向到引荐页面?
... authentication code above
if user.is_authenticated():
#show success view
else:
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('index'))
您可能需要检查引用页面网址是否设置正确,否则将其设置为默认网址(假设您的默认网址名为“index”)。
答案 1 :(得分:1)
答案 2 :(得分:0)
这是因为重定向到视图时会错过用于首先渲染页面的原始上下文。
你在这里只缺少一个简单的逻辑。您正尝试再次渲染相同的模板,但没有news_article列表。
我想(首先),您正在通过发送两件事来呈现模板,其中显示了文章和登录表单1.登录表单和2.文章列表。 但其次,当用户无法进行身份验证时,您不会再次传递相同的内容。将这些变量再次作为上下文传递(如果表单未处理错误消息,也可以添加错误消息)。
if user.is_authenticated():
#show success view
else:
return render_to_response('same_template.html', {
'error_msg': 'Username or password you provided was incorrect',
'news_articles': NewsArticles.objects.all()[:3],
'login_form': LoginForm(request.POST);
})
编辑:实际情况是,上下文用于呈现模板,它是该模板的全部责任,它希望在进一步导航中传递的内容。而且正如我所看到的,如果你没有进一步传递一些东西,那么你就无法进一步发展。
如果您想要一些自动化的上下文,请开发自己的上下文处理器,例如auth-context-processor,它会自动添加“用户”,模板始终可用。
顺便说一下,即使登录已经过身份验证,您也会错过这种情境。因此,如果该特定上下文非常重要,请尝试发送文章的主键以及登录表单提交,或者将其存储在全局(最丑陋的东西)中,或者只是重新考虑并分离流程(好的,我觉得)。 / p>