【问题标题】:update user and user profile on same form在同一表单上更新用户和用户个人资料
【发布时间】:2014-10-14 12:44:08
【问题描述】:

我为一些额外的用户信息创建了 userProfile。这是我的模型:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    picture = models.ImageField(upload_to=get_upload_path, blank=True)

    def __unicode__(self):
       return self.user.username

def create_user_profile(sender, **kwargs):
    u = kwargs["instance"]
    if not UserProfile.objects.filter(user=u):
        UserProfile(user=u).save()

post_save.connect(create_user_profile, sender=User)

我需要设置页面,在此页面中我将同时更新用户和用户配置文件字段的一些字段。这是我的表格:

class UpdateUserForm(ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name']

class UpdateUserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ['user']

我的模板中有一个表格,相关功能是:

def post(self, request, *args, **kwargs):
    update_user_form = UpdateUserForm(data=request.POST, instance=request.user)
    update_user_profile_form = UpdateUserProfileForm(data=request.POST)
    if update_user_form.is_valid() and update_user_profile_form.is_valid():
        user = update_user_form.save()
        userProfile = update_user_profile_form.save(commit=False)
        userProfile.user = user
        userProfile.save()

在这种情况下,我收到“列 user_id 不是唯一的”错误。为什么要尝试向该用户添加新的用户配置文件?

这种情况的最佳做法是什么?

谢谢

【问题讨论】:

  • 删除create_user_profile函数和post_save.connect(create_user_profile, sender=User)
  • 那么在这种情况下,当我们创建新用户时它将如何创建用户配置文件?
  • 你在def post这个函数的最后一行创建了userProfile
  • 是的,但我的意图是更新这条记录。不要创建新的。我试过你的建议,但我得到了同样的错误。
  • 如果您正在更新配置文件,而不是创建配置文件,您需要在表单上设置实例:update_user_profile_form = UpdateUserProfileForm(data=request.POST, instance=request.user.userprofile)

标签: django django-authentication


【解决方案1】:

前段时间我也遇到了同样的问题。最后,我选择更改我的自定义用户模型,使其继承自 AbstractUser(更多信息请点击此处:https://docs.djangoproject.com/en/dev/topics/auth/customizing/),而不是使用 onetoonefield 将其链接到 User:

models.py:

class CustomUser(AbstractUser):
    picture = models.ImageField(upload_to=get_upload_path, blank=True)

views.py:

class UpdateUser(LoginRequiredMixin, UpdateView):
    model = CustomUser
    fields = ('first_name', 'last_name', 'picture')
    template_name = 'user/edit.html'
    success_url = reverse_lazy('forum:top')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多