Django的。访问其他用户字段

时间:2014-02-09 12:39:07

标签: 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()功能的内容,但据我所知,它现在已被删除了。

那么,请告诉我如何访问此字段? 可能我做错了吗?如果是,那么做这些事情的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

你在这里错过了一步。您需要检查两者用户和配置文件表单是否有效。然后,您需要保存用户表单以获取User对象。然后,您需要创建配置文件对象,将其与用户关联,然后保存。

我不知道你为什么要单独设置个人资料图片 - 当然它应该是个人资料表格的一部分,并且会与它一起保存。

答案 1 :(得分: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