【问题标题】:Django User profile model form edit for current user当前用户的 Django 用户配置文件模型表单编辑
【发布时间】:2020-07-03 03:31:51
【问题描述】:

我对此进行了很多搜索,但提供的所有问题和答案都不清楚且不符合目的,也许我走错了路。 我最近刚开始使用 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 有什么好处?

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

【问题讨论】:

  • 使用form.save() 你将更新 User 对象,而不是创建一个新的UserProfile,那是因为你传递了instance=request.user。
  • @WillemVanOnsem 感谢您的评论。我将 instance=request.user 更改为 instance=user_profile 并且有效!这种做法正确吗?另外,与此相关的附带问题是,如何在通过正常注册或社交身份验证创建新用户时自动创建 UserProfile 记录?非常感谢。
  • 关于在创建用户后创建用户配置文件使用信号。每当保存用户时,使用post_save 信号检测。 here 你有如何使用信号的例子。

标签: python django django-models django-forms django-users


【解决方案1】:
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 一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2014-06-17
    • 2014-04-29
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多