2012-07-30 63 views
2

在django中,我使用authenticate()函數登錄用戶。使用request.user,我可以訪問從users表中提取的登錄用戶信息。如果我這樣做request.user.id,我可以得到用戶的ID。在任何模板中,根據任何請求,我可以使用user.username來獲取用戶名。添加到django request.user變量

有沒有一種方法可以將值添加到request.user變量中,以便我可以在整個應用程序和模板中使用它們?

例如,我想這樣:request.user.timezone當用戶登錄到網站時設置;我應該能夠在模板和我的視圖中訪問這個變量。

+0

你是如何檢測時區的?您可以使用cookie,會話或修改請求中間件,或者如果您只是與經過身份驗證的用戶合作,則可以爲配置文件提供幫助。 – 2012-07-30 09:27:44

+0

用戶在配置文件中設置時區,在「Profile」模型中。它只是一個例子,但;當用戶登錄到站點時,我想設置'request.user.x',x是任何值。 我可以只做'request.user.x =「value」'嗎? – q3d 2012-07-30 09:31:00

回答

2

你想讓用戶改變它的時區並強制一個特定的時區嗎?我假設你會,如果是這樣,你想保持你的數據庫中的時區配置。因此,我建議您製作一個與用戶對象具有一對一關係的UserProfile模型。

你可以這樣做:

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    time_zone = models.whateverField() 
    ... add anything else you would like to extend your profile ... 

在您templete,你將能夠通過這樣做,得到的時區:

{{ request.user.userprofile.time_zone }} 

簡單,很乾淨。

如果您希望在保存User對象時自動創建userprofile,則可以使用該對象的信號。

1

你可以寫一個簡單的中間件:

class UserTZMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     if request.user.is_authenticated(): 
      request.user.timezone = evaluate_tz() 

,然後在settings.py文件追加到MIDDLEWARE_CLASSES這樣的:

MIDDLEWARE_CLASSES = (
    ...., 
    'myapp.UserTZMiddleware', 
) 
0

使用sessions,其目的是爲了保持上下文中的變量。

你不應該改變request.user,因爲這是其他應用程序依賴的東西,也是由django自己的驗證機制填充的東西。

如果您需要專門跟蹤時區,請閱讀django 1.4中的timezone support。在文檔中它提供了設置和管理用戶時區的示例。