如何在登录失败时重定向到同一页面

时间:2009-07-15 02:23:47

标签: python django authentication redirect login

当用户无法正常登录时,Django框架可以轻松处理重定向。但是,此重定向将转到单独的登录页面。我可以将模板设置为与我登录的页面相同,但新页面中不存在任何其他对象。

例如,我有一个显示一堆新闻文章的首页。侧栏上是登录表单。当用户登录但无法进行身份验证时,我希望它返回首页保留显示的所有新闻文章。截至目前,没有新闻文章出现。

如何解决此问题?任何帮助表示赞赏。

编辑:请记住,我有正在显示的动态内容,我希望它仍然显示!此外,主页面并不是用户可以登录的唯一位置。侧边栏永远不会更改,因此用户可以从网站上的任何页面进行潜在登录,并且该页面上的所有内容完全按照其仍然需要在登录失败时显示。

3 个答案:

答案 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)

  1. 使用侧边栏中的<IFRAME> 调用登录视图 - 所有回发 将在iframe内发生,所以 您的页面保持不变。如果 访客成功登录,你 可以使用javascript重定向 父网页到其他网址
  2. 使用AJAX发布登录表单 - 实现与(1)相同的效果,但是 这意味着您的访问者需要 有启用javascript的浏览器
  3. 我个人更喜欢在单独的页面上登录。如果您只是担心您的访问者丢失当前页面(而不是说,由一个挑剔的客户端绑定),您可以在lightbox中显示登录信息。我过去曾使用过这三种方法,如果您有兴趣,我会很乐意发布一些代码示例。

答案 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>