首页 > 解决方案 > 当前用户的 Django 用户配置文件模型表单编辑

问题描述

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

我在models.py中有以下UserProfile:

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,似乎我设法使用UserProfile.objects.get(user=request.user)UserProfileForm(request.POST, instance=request.user )但不确定这是否是正确的方法。目前,我的代码在 html 表单输出中填充了 first_name、last_name 和电子邮件地址,但是当更新字段并单击“更新”按钮时,它会刷新但不会保存到数据库。

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

如果您对更简单的方法提出建议,我会全力以赴。我也尝试过研究 UpdateView 方法,但我发现的所有示例总是有差距,我无法满足我的目的。在 ModelForm 上使用 UpdateView 有什么好处?

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

标签: pythondjangodjango-modelsdjango-formsdjango-users

解决方案


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 一样。


推荐阅读