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

2024-05-11 18:49:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,我有一个首页,上面有一堆新闻文章。侧边栏上是一个登录表单。当用户登录,但无法进行身份验证时,我希望它返回到首页并保留显示的所有新闻文章。作为最新的新闻,没有一篇是最新的。在

我怎样才能解决这个问题?感谢任何帮助。在

编辑:请记住,我有正在显示的动态内容,我希望它仍然显示!此外,主页并不是用户唯一可以登录的地方。侧边栏永远不会改变,因此用户可以从站点上的任何页面登录,并且该页面上的所有内容仍然需要在登录失败时显示出来。在


Tags: 对象django用户框架身份验证模板编辑表单
3条回答

这是因为重定向到视图会丢失最初用于呈现页面的原始上下文。在

你只缺少一个简单的逻辑。您正在尝试再次呈现相同的模板,但没有新闻文章列表。在

我想(首先),您通过发送两件事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,它会自动添加“user”之类的内容,始终可用于模板。在

顺便说一句,你无论如何都会错过这种上下文,即使登录是经过身份验证的。因此,如果特定的上下文非常重要,可以尝试将文章的主键与登录表单submit一起发送,或者将其存储在global(有史以来最丑的东西)中,或者重新考虑并分离流(我觉得是好事)。在

是否要在登录失败时重定向到引用页?在

... authentication code above

if user.is_authenticated():
    #show success view
else:
    return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('index'))

您可能需要检查引用页面url是否设置正确,否则将其设置为默认url(假设您的默认url命名为“index”)。在

  1. 在侧边栏中使用<IFRAME>来 调用登录视图所有回发 会在iframe中发生,所以 你的页面保持不变。如果 访问者登录成功,您 可以使用javascript重定向 指向其他URL的父页
  2. 使用AJAX发布登录表单 A的效果与(1)相同,但是 这意味着你的访客需要 支持javascript的浏览器

我个人更喜欢在单独的页面上登录。如果您只担心您的访问者丢失当前页面(而不是说,被一个挑剔的客户机绑定),那么您可以让登录显示在lightbox中。我过去使用过这三种方法,如果您感兴趣,我很乐意发布一些代码示例。在

相关问题 更多 >