更新同一表单上的用户和用户配置文件

时间:2014-10-14 12:44:08

标签: django django-authentication

我为其他一些用户信息创建了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不是唯一的"错误。为什么要尝试为此用户添加新的用户个人资料?

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

谢谢

1 个答案:

答案 0 :(得分:0)

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

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')