2014-02-09 83 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