2011-09-25 64 views
0

應該是一個簡單的答案,但我無法弄清楚什麼是錯在這裏...更新用戶配置文件字段的Django

我有幾個簡單的字段的用戶配置文件。我試圖像這樣更新它們:

if data['dob'] != None:  
    request.user.profile.dob = data['dob'] 

request.user.profile.save() 

雖然這似乎沒有任何影響。

p.s.我在我的UserProfile類中使用了一個很好的小竅門,如下所示:

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) 

這可能是問題的一部分嗎?

回答

0

想想代碼中會發生什麼。

如果您的數據中有dob,請致電request.user.profile。這會調用您的屬性,該屬性向數據庫發出請求並獲取或創建配置文件實例。

接下來,您再次撥打request.user.profile。猜猜這是什麼?重新調用數據庫,並再次獲取配置文件的實例。但是,當然這是一個新的實例,即使它指的是同一個數據庫行,所以它不會具有剛纔在最新版本中設置的dob的值。

現在,可能你可以通過存儲在一個局部變量的輪廓解決這個問題:

profile = request.user.profile 
profile.dob = data['dob'] 
profile.save() 

但說實話,我就把你整與配置文件屬性周圍黑客。它會給你帶來各種各樣的問題。

+0

感謝您的明確答案。你會用這種方法預見什麼其他問題?另外,即使我正常使用'request.user.get_profile()',問題仍然存在於我的實現中? – Ferguzz

+0

get_profile專門用於避免這種情況,因爲它在首次查找時緩存配置文件實例。請參閱django.contrib.auth.models中的代碼。 –