2009-07-15 53 views
2

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

例如,我有一个显示一堆新闻报道的首页。在侧边栏上是登录表单。当用户登录但未通过身份验证时,我希望它返回到首页保留所有显示的新闻报道。截至目前,没有任何新闻报道出现。

我该如何解决这个问题?任何帮助表示赞赏。

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

回答

6

您是否希望重定向到失败登录时的引用页面?

... authentication code above 

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

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

+0

如果我使用django.contrib.auth.views.login,该怎么办? – AlbertoPL 2009-07-15 02:40:04

+0

@AlbertoPL该视图没有重定向失败 – Evgeny 2009-07-15 02:52:41

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,它会自动添加类似'用户'的字符,并始终可供模板使用。

顺便说一下,无论如何,即使登录通过身份验证,您也会错过这种上下文。因此,如果特定的上下文非常重要,可以尝试发送文章的主键以及登录表单提交,或者将其存储在全局(有史以来最丑陋的事情)中,或者只是重新考虑和分离流(我认为是好事)。

0
  1. 在侧边栏使用的<IFRAME>到 呼叫登录视图 - 所有回传 将在iframe中发生,所以 你的页面保持不变。如果 游客成功登录,您 可以使用JavaScript的 父页面重定向到一些其他的URL
  2. 使用AJAX张贴登录表单 - acheives相同的效果(1),但 这意味着你的游客将需要 启用JavaScript的浏览器

我个人更喜欢有一个单独的页面上登录。如果您只担心您的访问者丢失了当前页面(而不是说被一个模糊的客户端绑定),则可以登录到lightbox。过去我使用过这三种方法,如果您有兴趣,我很乐意发布一些代码示例。

相关问题