Django 德扬戈。访问附加用户字段

Django 德扬戈。访问附加用户字段,django,Django,我正在尝试创建一个表单,这样用户就可以将一个头像上传到他的个人资料中。 我有一门课看起来像这样: class UserProfile(models.Model): user = models.OneToOneField(User, related_name='profile') picture = models.FileField(upload_to='media/images', blank=True, null=True) 现在我想访问视图中的字段picture,这样我可以

我正在尝试创建一个表单,这样用户就可以将一个头像上传到他的个人资料中。 我有一门课看起来像这样:

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('/')
                    ...
然后将其传递给模板。 我在某个地方读到,我可以通过模型中指定的
相关名称
访问此类字段,所以这就是我尝试的。 但当我试图上传图片时,它会说:
用户没有个人资料。

我也读了很多关于
get_profile()
函数的书,但据我所知,它现在已经过时了

那么,您能告诉我如何访问此字段吗?

也许是我做错了?如果是,那么做这些事情的正确方法是什么?

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


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

我想您可能会感到困惑:

 userForm = SignupForm(request.POST, instance=user)
 profileForm = ProfileForm(request.POST, request.FILES)
您同时使用两个不同的表单,但仅验证第一个表单:

if userForm.is_valid():
您得到的结果是,
用户没有配置文件。
因为,当用户存在时,配置文件没有(无论如何,在运行
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

谢谢您的回复!所以,我按照你的建议做了。现在,“print(profileForm.instance.user)”返回当前用户,但当我试图保存profileForm时,它会说:“列用户id不唯一”。正如我对保存图片的理解,它应该是这样的:“user.profile.picture=request.FILES['picture']”并且它不应该在保存profileForm之前执行吗?好。。我真的很困惑下一步该怎么办:\n有没有一种方法可以在一个模型中完成所有这些事情?如果配置文件已经存在,那么需要在对表单的调用中使用
instance
参数:
ProfileForm(request.POST,request.FILES,instance=…)
。您可以使用一些条件来确定用户是否有相关的配置文件对象。谢谢您的回复!我为两个表单都添加了验证。你能举一个例子说明我如何创建profile对象吗?当你谈论单独的个人资料图片时,你指的是2个模型?我想我不需要它,但我不知道如何以另一种方式扩展默认用户模型。。