当前用户的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和电子邮件地址,但是当更新字段并单击“ Update”按钮时,它会刷新,但不会保存到数据库中。

form.save()是否不够,或者我做错了什么?

如果您有关于更简单方法的建议,那么我非常欢迎。 我也尝试过研究UpdateView方法,但同样,我发现的所有示例始终存在差距,因此无法满足我的目的。在ModelForm上使用UpdateView有什么好处?

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

xsj21 回答:当前用户的Django用户个人资料模型表单编辑

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

本文链接:https://www.f2er.com/2602543.html

大家都在问