2008-09-03 73 views
27

我正在爲一家小公司設計一個小型Intranet站點,用戶應該能夠發佈該站點。我設想一個非常簡單的認證機制,人們只需輸入他們的電子郵件地址,併發送一個唯一的登錄網址,該網址設置一個cookie,以便將來的請求標識它們。始終在django模板上下文中包含用戶

在我的模板設置中,我有base.html,其他頁面擴展了它。我想在base.html中顯示登錄或註冊按鈕,但是如何確保必要的變量始終是上下文的一部分?似乎每個觀點都只是按照自己喜歡的方式設置背景,並且沒有全球背景人口。有沒有這樣做,而不包括用戶在每個上下文創建?

或者我將不得不讓我自己的自定義快捷方式來正確設置上下文?

回答

18

從更一般的意義上說,不必在每個視圖中明確設置變量,這聽起來像你想看看自己編寫的context processor

從文檔:

上下文處理器有一個非常簡單的接口:這只是一個Python函數,它接受一個參數,一個HttpRequest對象,並返回被添加到模板上下文的字典。每個情境處理器必須返回一個字典。

2

如果您可以將身份驗證連接到Django authentication scheme,則可以使用request.user

我認爲這應該只是基於您的Cookie的內容調用authenticate()login()的情況。

編輯:@Staale - 我總是使用locals() trick作爲我的上下文,所以我的所有模板都可以看到requestrequest.user。如果你不是那麼我想這不會那麼簡單。

32

@Ryan:關於預處理程序的文檔是有點小

@Staale:將用戶添加到每次一個正在調用視圖模板的背景下,幹

解決方案是使用預處理器

一個:在你的設置中添加

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user', 
) 

:在myapp/processor_file_name中。py插入

def user(request): 
    if hasattr(request, 'user'): 
     return {'user':request.user } 
    return {} 

從現在開始,您可以在模板中使用用戶對象功能。

​​3210
+0

的Django給出了錯誤'把「django.contrib.auth.context_processors.auth」你TEMPLATE_CONTEXT_PROCESSORS才能使用管理application.`即使我做到這一點,模板仍然不知道如何設置`user`。 – hobbes3 2012-03-10 17:27:54

+4

@ hobbes3因爲您沒有使用RequestContext,所以上下文處理器不會被執行。 – 2012-03-10 18:55:04

+0

@rebus實際上,在我的`views.py`中,我使用`render_to_resposne`傳遞了一個簡單的字典,與'RequestContext`相對。謝謝您的幫助。 – hobbes3 2012-03-11 16:32:28

1

其可能在默認情況下,通過執行以下步驟,確保已添加的背景下「django.contrib.auth.context_processors.auth '在你的設置中。默認情況下,它的settings.py中添加的,所以它看起來像這樣的這種

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request', 
'django.contrib.auth.context_processors.auth', 
'django.core.context_processors.auth',) 

,您可以訪問用戶對象,

{% if user.is_authenticated %} 
<p>Welcome, {{ user.username }}. Thanks for logging in.</p> 
{% else %} 
    <p>Welcome, new user. Please log in.</p> 
{% endif %} 

欲瞭解更多信息,請參考這裏http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

3

的提示在每一個答案,但從「從頭開始」,再次,爲新手:

身份驗證數據在模板(幾乎)默認情況下 - 一個小竅門:

views.py

from django.template import RequestContext 
... 
def index(request): 
    return render_to_response('index.html', 
           {'var': 'value'}, 
           context_instance=RequestContext(request)) 

index.html

... 
Hi, {{ user.username }} 
var: {{ value }} 
... 

從這裏:https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

此模板上下文變量不可用,如果的RequestContext是 不是貝使用ng。