当前用户的 Django 用户配置文件模型表单编辑

Django User profile model form edit for current user

我对此进行了很多搜索,但提供的所有问题和答案从来都不是很清楚,也不符合目的,也许我的处理方式不对。 我最近才开始使用 Python 和 Django,所以对它知之甚少。 我正在创建一个网站并使用 Django 完成了基本身份验证,甚至使用 social-django 添加了 facebook 身份验证。那部分一切正常。 现在我要转到个人资料信息以及如何在您注册网站后更新它。

我在 models.py 中有以下用户配置文件:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.TextField()
    last_name = models.TextField()
    email_address = models.EmailField()
    phone_number = models.TextField()

在forms.py一个测试表格中:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['first_name','last_name','email_address']

然后在views.py我有一个函数:

def myprofile(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            user_profile = UserProfile.objects.get(user=request.user)
    if request.method == 'GET':
        user_profile = UserProfile.objects.get(user=request.user)
        form = UserProfileForm(instance=user_profile)

    return render(request, 'pandp/myprofile.html',
                 {'user_profile' : user_profile, 'form' : form})

最后 myprofile.html:

<div class="profile-details">
   <form method="post">{% csrf_token %}
     {{ form.as_p }}
     <input type="submit" value="Update">
   </form>
</div>

我从一开始就苦苦挣扎,实际上只加载登录用户的用户配置文件,看来我设法使用 UserProfile.objects.get(user=request.user) UserProfileForm(request.POST, instance=request.user) 但不确定这样做是否正确。 目前我的代码在 html 表单输出中填充 first_name、last_name 和电子邮件地址,但是当更新字段并单击 'Update' 按钮时,它会刷新但不会刷新保存到数据库。

是 form.save() 不够还是我做错了什么?

如果您有更简单的方法建议,我会洗耳恭听。 我也试过研究 UpdateView 方法,但我发现的所有示例总是有差距,我无法满足我的目的。使用 UpdateView 而不是 ModelForm 有什么好处?

也许是冗长而冗长的问题,但希望您能解决问题,并希望这可以帮助其他有类似问题的人。

def myprofile(request):
    if request.method == 'POST':
        user_profile = UserProfile.objects.get(user=request.user)
        form = UserProfileForm(request.POST, instance=user_profile)
        ...

您需要获取 UserProfile 实例并将其传递给 UserProfileForm,就像评论中提到的 @willem-van-onsem 一样。