2016-12-01 36 views
0

我試圖讓一個已經登錄的用戶訪問登錄頁面時,他們被重定向到他們的帳戶頁面。如果用戶已經登錄到Django中,如何從登錄頁面重定向?

我決定通過擁有自己的登錄視圖來檢查用戶是否已登錄並重定向(如果是)。如果他們沒有登錄,它將繼續使用contrib登錄視圖。

問題是我需要能夠指定contrib登錄authentication_form和template_name。當我直接調用login()時,如何指定這些內容?

我運行Django的版本1.10.3

這裏是我的代碼...

urls.py

from django.conf.urls import include, url 
from django.conf import settings 
from django.conf.urls.static import static 
from django.contrib import admin 
from Account.views import RenderLoginPage 
from django.contrib.auth.views import logout 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^login/$', RenderLoginPage, name='login'), 
    url(r'^logout/$', logout, {'next_page': '/login'}, name='logout') 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

views.py

from django.shortcuts import redirect 
from django.urls import reverse 
from django.contrib.auth.decorators import login_required 
from django.contrib.auth.views import login 
from forms import LoginForm 

def RenderLoginPage(request): 
    if request.user.is_authenticated(): 
     return redirect(reverse("myaccount")) 
    else: 
     return login(request) 

那麼怎麼辦我指定template_name & authentication_form?如果我直接通過URL來做這件事,而沒有自定義的登錄視圖,我會這麼做......但我不能,因爲我需要自定義登錄視圖。

url(r'^login/$', login, {'template_name': 'login.html', 'authentication_form': LoginForm}, name='login'), 
+0

哪個Django的版本? –

+0

@AamirAdnan 1.10.3 – Ricky

回答

2

不要使用基於功能視圖,基於使用類視圖LoginView

from django.contrib.auth.views import LoginView as DefaultLoginView 

class LoginView(DefaultLoginView): 
    redirect_authenticated_user = True 

login = LoginView.as_view() 

或者乾脆導入urls.py基於類視圖,並通過redirect_authenticated_user=True

from django.contrib.auth.views import LoginView 

url(r'^login/$', LoginView.as_view(), 
    {'template_name': 'login.html', 'authentication_form': LoginForm, 'redirect_authenticated_user': True}, 
    name='login') 
+0

謝謝!這是完美的,最好的是我能夠完全刪除自定義登錄視圖,並直接在urls.py – Ricky

+0

中應用redirect_authenticated_user是隻需導入基於類的視圖並直接在url模式中將'redirect_authenticated_user'在額外的數據中傳遞:) –

相關問題