【发布时间】: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