2012-02-20 80 views
0

我們使用@login_required裝飾器,以便用戶在嘗試訪問他們需要的url時看到登錄頁面得到認證。 我們希望在登錄頁面上顯示一個'取消'按鈕,當用戶嘗試訪問網址時,它應該將用戶返回到他們所在的任何頁面(通過點擊鏈接等 - 我們不需要手動處理它們輸入網址)。顯示登錄頁面上的'取消'以將用戶返回到他們所在的位置(使用django.contrib.auth)

目前我們的login.html查找請求參數'login_cancel_url',如果存在的話使用該參數(否則爲主頁)。

但是,這意味着只要我們顯示導致「需要身份驗證」url的鏈接或按鈕,我們就必須手動傳遞此參數(設置爲當前頁面的url)。

有沒有更好的方法來做到這一點?

謝謝,馬丁

回答

1

那麼你可以嘗試從請求得到referrer header但據我所知,它是依賴於瀏覽器和is not very reliable所以你正在做的方式可能是最好的。您可以通過創建模板標籤來避免重新手動重寫網址,從而讓生活變得更輕鬆。

你可以輕易地得到Django的request對象的當前URL的網頁上,所以不是手動設置它的鏈接,你可以寫HTML的一個片段:

link_to_login.html

<!-- You should probably get /login/ using the {% url ... %} template tag --> 
<a href="/login/?login_cancel_url={{ request.path|urlencode }}"> 
Login Page</a> 

並使用{% include "link_to_login.html"%}模板標籤。

另外,如果文本必須根據不同的鏈接,你可以代替創建inclusion template tag

templatetags/extra_auth_tags.py

@register.inclusion_tag('templates/extra_auth_tags/login_link.html') 
def login_link(context, text=None): 
return { 
    'text':text 
} 

模板/ extra_auth_tags/LOGIN_LINK .html

<!-- You should probably get /login/ using the {% url ... %} template tag --> 
<a href="/login/?login_cancel_url={{ request.path|urlencode }}"> 
{% if text %} 
    {{ text }} 
{% else %} 
    Some Default Text 
{% endif %} 
</a> 

,然後在您的模板中將其稱爲{% login_link text="Check you messages" %}。請注意,包含標籤的關鍵字參數僅在django dev版本中受支持,因此您可能需要手動編寫模板標籤。

+0

謝謝pastylegs。我想我會使用request.META.HTTP_REFERER(如果它存在並且如果不在主頁上,或者根本不顯示取消按鈕)。自發布以來,我檢查了一些熱門網站,並注意到大多數網站不會在攔截登錄頁面上顯示取消按鈕 - 大概是因爲它不是微不足道的! – 2012-02-20 14:30:33

相關問題