2012-03-01 48 views
2

是否有推薦的方法將變量傳遞給我的所有視圖?就我而言,我想傳遞一個UserProfile對象,該對象是一個django.contrib.auth.models.User對象。我發現大部分(如果不是全部)我的視圖需要拉取UserProfile對象並將它放入Middleware看起來就像是要走的路。好像我可以做類似如下(我見過一對夫婦的解決方案,在線的暗示吧):在不使用request.session的情況下將自定義變量添加到Django Middleware中的請求對象中

request.session['userprofile'] = userprofile_object 

我不喜歡這一點,因爲如果我的用戶配置模型曾經有一個非序列化字段,它會打破request.session。

回答

0

此提議取決於用戶配置對象僅在用戶已登錄時才起作用的假設,因此您可以通過request.user獲取登錄用戶。 應該可以通過行駛在逆向這樣的外鍵鍵關係得到USERPROFILE:

if request.user.is_authenticated(): 
    request.user.userprofile_object_set.all() #gets all related userprofile objects 
else: 
    #... 
+0

是的,有多種方式可以獲取UserProfile對象。你也可以做UserProfile.objects.filter(user = request.user),但是這並不回答這個問題,你如何將它傳遞給視圖? – jsw 2012-03-01 23:20:37

+0

也許我誤解了你的問題。因爲每個視圖都獲取作爲第一個參數傳入的請求,所以不需要將該配置文件「傳遞」到視圖中。如果你想在每個模板上都有一個userprofile變量,你可以考慮一個自定義的context_processor,它將userprofile_object放入一個變量中。 – Jingo 2012-03-01 23:29:13

+0

我相信'prof = request.user.userprofile_object_set.all()[0]'每次調用時都會觸發數據庫? – user9876 2012-10-08 16:16:15

3

如果您已經啓用了AuthenticationMiddleware,你將不得不在所有的意見user對象。要獲取配置文件,您需要在您的視圖中撥打user.get_profile。例如,要輸出配置文件的ID,您應該執行{{ user.get_profile.id }}

如果您不希望每次都調用用戶對象的get_profile函數,則可以將任意項添加到您的請求中。您可以創建一個新的中間件這將只需設置

request.user_profile = request.user.get_profile() 

然後,只需登記您的settings.py中間件,你應該是好去。過去,我使用這種方法來獲取固定到請求對象的用戶地理位置數據。

相關問題