2013-02-05 35 views
2

我有我目前有大約標準登錄查看包裝一個Django項目:如何在成功登錄後向Django的響應上下文添加內容?

from django.contrib.auth import views as auth_views 
from myapp.forms import LoginForm 

def login(request, *args, **kwargs): 
    """Wrapper for auth.login.""" 
    kwargs['template_name'] = 'login.html' 
    kwargs['authentication_form'] = LoginForm 
    auth_view_response = auth_views.login(request, *args, **kwargs) 
    return auth_view_response 

這一切工作正常,但我想的東西添加到應答上下文的下一個頁面上,只有在登錄已成功。我不知道如何:

  1. 檢查該用戶成功登錄auth_views.login()被稱爲後,或
  2. 添加一個變量,將在接下來的頁面的情況下出現。

回答

1

談到的第一個問題:

檢查該用戶成功登錄後auth_views.login()被調用,或

裏面的查看功能檢查request.user.is_authenticated()

說到第二個問題,您可以在用戶會話中添加變量,然後在下一頁檢查它:

#in the view mentioned above  
if request.user.is_authenticated(): 
    request.session['some_key'] = "some_var" 

#in the view, that represents the next page 
foo = request.session.get('some_key',None) 
#now you can add foo to template context 
+0

Thanks DataGreed。但在上面的視圖中,我可以執行'request.user.is_authenticated()'? –

1

通常,在發佈我的SO問題後不久,我想出了一個答案。

我不需要對登錄視圖做任何事情。相反,我用的是user_logged_in信號:(我把在我的myapp/models/userprofile.py年底)

from django.contrib.auth.signals import user_logged_in 

def post_login_actions(sender, user, request, **kwargs): 
     request.session['just_logged_in'] = True 

user_logged_in.connect(post_login_actions, dispatch_uid="user_logged_in") 

然後,我有一個myapp/context_processors.py這樣的:

from django.conf import settings 

def membership_context(request): 
    context = { 
     'just_logged_in': request.session.get('just_logged_in', False), 
    } 
    # Now we've used any True setting for this, set it to False subsequent requests: 
    request.session['just_logged_in'] = False 
    return context 

而且,中當然,包括在我的設置'TEMPLATE_CONTEXT_PROCESSORS

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS 
TEMPLATE_CONTEXT_PROCESSORS += (
    'myapp.context_processors.membership_context', 
) 

現在,每個模板的上下文中都有一個值just_logged_in,通常爲False,但在用戶登錄後的第一個頁面視圖中爲True。