2014-02-09 110 views
0

我正在嘗試創建表單,因此用戶可以將頭像上傳到他的個人資料。 我有一個類,它看起來像這樣:Django。訪問其他用戶字段

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 
    picture = models.FileField(upload_to='media/images', blank=True, null=True) 

,現在我要訪問我的看法領域picture,這樣我就可以把一些照片在裏面。 我試圖做到這一點,像這樣:

if request.method == 'POST': 
     userForm = SignupForm(request.POST, instance=user) 
     profileForm = ProfileForm(request.POST, request.FILES) 
     if userForm.is_valid(): 
      ... 
      user.profile.picture = request.POST['picture'] 
        ... 
      profileForm.save() 
      return HttpResponseRedirect('/') 
        ... 

,然後把它傳遞給模板。 我在某處讀到我可以通過模型中指定的related_name來接受這樣的領域,所以這就是我的嘗試。 但是,當我試圖把它上傳說的圖片:User has no profile.

我也讀到get_profile()功能很多,但我的理解它現在depricatred。

那麼,請問,請問我該如何訪問此字段?
可能是我做的一切都錯了嗎?如果是,那麼做這種事情的正確方法是什麼?

回答

1

您錯過了一步。您需要檢查這兩個用戶和配置文件表單是否有效。然後,您需要保存用戶表單以獲取用戶對象。然後,您需要創建配置文件對象,將其與用戶關聯並保存。

我不知道爲什麼要單獨設置個人資料圖片 - 當然,它應該是個人資料表單的一部分,並且會一起保存。

+0

感謝您的答覆! 我添加了這兩種形式的驗證。 您可以舉一個例子來說明如何創建配置文件對象? 當你在談論單獨的個人資料圖片時,你的意思是2個模型?我想我不需要它,但我不知道如何以其他方式擴展默認用戶模型。 –

0

這裏就是我想你感到困惑:

userForm = SignupForm(request.POST, instance=user) 
profileForm = ProfileForm(request.POST, request.FILES) 

您使用兩種不同的形式在同一時間,但僅在驗證第一:

if userForm.is_valid(): 

和你」重新獲得是User has no profile.,因爲當用戶存在時,配置文件不會(不是在運行profileForm.save()之前)。請記住,這是兩種不同的模式。即使這樣,你也做錯了,原因有二:

  • 圖片將駐留在request.FILES而不是request.POST,因爲它是很好,
  • 你想要的圖片分配到user.profile.picture文件 - 但這沒有意義,因爲您應該將其分配給配置文件,然後將該配置文件鏈接到用戶(請記住,用戶是配置文件模型上的字段)。 ,當然,如果圖片是形式的一部分,您不需要那麼做呢

,本質上,這一點:

profileForm = ProfileForm(request.POST, request.FILES) 
profileForm.instance.user = request.user #link the profile to current user 
if profileForm.is_valid(): 
    profileForm.save() #now you have a profile 
+0

感謝您的迴應! 所以,我做了你的建議。現在「print(profileForm.instance.user)」返回當前用戶,但是當我試圖保存profileForm時,它會顯示:「column user_id不唯一」。 正如我理解保存圖片應該是這樣的:「user.profile.picture = request.FILES ['圖片']」並不是它應該保存profileForm之前執行? 嗯..我真的很困惑接下來該怎麼做:\ 有沒有一種方法可以在一個模型中完成所有這些事情? –

+0

如果配置文件已經存在,則需要在調用窗體時使用'instance'參數:'ProfileForm(request.POST,request.FILES,instance = ...)'。您可以使用一些條件來確定用戶是否具有相關的配置文件對象 – yuvi