2009-07-15 169 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。過去我使用過這三種方法,如果您有興趣,我很樂意發佈一些代碼示例。

相關問題