2009-04-30 85 views
148

我正在嘗試構建一個簡單的網站,其登錄功能與此處非常相似。 用戶應該能夠以匿名用戶的身份瀏覽網站,並且每個頁面上都會有一個登錄鏈接。當點擊登錄鏈接時,用戶將被帶到登錄表單。成功登錄後,用戶應該被帶回到他首先點擊登錄鏈接的頁面。 我猜我必須以某種方式將當前頁面的URL傳遞給處理登錄表單的視圖,但我無法真正實現它的工作。編號: 我想通了。我通過傳遞當前頁面作爲GET參數鏈接到登錄表單,然後使用'next'重定向到該頁面。謝謝!Django:登錄後重定向到上一頁

編輯2: 我的解釋似乎並不清楚,從而要求在這裏是我的代碼: 比方說,我們在一個頁面foo.html,我們還沒有登錄現在,我們希望有一個鏈接。在foo.html鏈接到login.html。在那裏,我們可以登錄,然後重定向到foo.html。 上foo.html鏈接看起來是這樣的:

 <a href='/login/?next={{ request.path }}'>Login</a> 

現在我寫道,看起來有點像這樣的自定義登錄視圖:

def login_view(request): 
    redirect_to = request.REQUEST.get('next', '') 
    if request.method=='POST': 
     #create login form... 
     if valid login credentials have been entered: 
     return HttpResponseRedirect(redirect_to) 
    #... 
    return render_to_response('login.html', locals()) 

而且在login.html的重要線路:

<form method="post" action="./?next={{ redirect_to }}"> 

所以是的,這是非常多的,希望能夠說清楚。

+1

我覺得Django登錄的東西爲你處理,它不適合你嗎? – 2009-04-30 13:16:04

回答

121

你並不需要爲這額外的視圖,該功能已經內置

帶登錄鏈接的每個頁面需要知道當前路徑,最簡單的方法是將請求上下文preprosessor添加到settings.py(第一個默認值爲4),然後請求對象將在每個請求中可用:

settings.py:

基地:

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth", 
    "django.core.context_processors.debug", 
    "django.core.context_processors.i18n", 
    "django.core.context_processors.media", 
    "django.core.context_processors.request", 
) 

然後在您需要的登錄鏈接模板添加。HTML:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a> 

這將添加一個GET參數,它指向當前頁面的登錄頁面。

登錄模板然後可以如此簡單:

註冊/ login.html的:

{% block content %} 
<form method="post" action=""> 
    {{form.as_p}} 
<input type="submit" value="Login"> 
</form> 
{% endblock %} 
+40

我個人使用此解決方案,但是我要做的一個修改是,如果request.path`爲空,它會失敗,所以我使它成爲'{%firstof request.path'/'%}`,這樣如果由於某種原因用戶被髮送到主頁,請求路徑不可用。 – jorelli 2011-10-12 16:40:32

14

Django的內置身份驗證以您想要的方式工作。

他們的登錄頁面包括一個next查詢字符串,這是登錄後要返回的頁面。

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required

+3

好吧,login_required裝飾器會工作得很好,因爲它爲我來自的任何頁面設置「下一個」,但是當使用裝飾器時,匿名用戶無法查看網站,因爲它們將立即重定向到登錄表單。我想我只需要弄清楚如何將'next'的值設置爲用戶來自的頁面的url。 – 2009-04-30 13:49:07

0

見Django文檔爲views.login(),您輸入表單上提供一個「下一個」值(作爲隱藏字段)重定向到一個成功登錄後。

+0

是的,但我該如何設置'下一個'來自我來自的網頁? – 2009-04-30 13:36:45

1

我通過傳遞當前頁面作爲GET參數鏈接到登錄表單,然後使用'next'重定向到該頁面。謝謝!

24

這可能不是一個「最佳做法」,但我已經成功地使用在此之前:

return HttpResponseRedirect(request.META.get('HTTP_REFERER','/')) 
+8

這有一個薄弱點 - 一些用戶/瀏覽器已通過引用關閉 – 2010-07-19 21:36:47

+4

也有問題的情況下,用戶到達表單,填寫信息,然後提交。 HTTP_REFERER然後是表單頁面的URL,而不是用戶首先來自的頁面的URL。 – LaundroMat 2011-10-27 10:06:51

+1

如果第一次提交包含錯誤,則用戶更正... – Bryce 2014-01-17 21:43:11

1

我遇到同樣的問題。該解決方案允許我使用通用登錄視圖保持:

urlpatterns += patterns('django.views.generic.simple', 
    (r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}), 
) 
1

registration/login.html(嵌套templates文件夾內),如果你插入下面的行,該頁面會呈現像Django的原始管理員登錄頁面:

{% include "admin/login.html" %} 

注意:該文件只能包含上面的行。

19

爲了支持PARAM /值的完整URL你需要:

?next={{ request.get_full_path|urlencode }} 

,而不只是:

?next={{ request.path }} 
-2

你也可以做到這一點

<input type="hidden" name="text" value="{% url 'dashboard' %}" />