使用更新视图将OneToOne保存到用户

时间:2014-11-20 16:58:21

标签: django

models.py

from django.contrib.auth.models import User

class UserProfile(Model):
    vendor_venue = BooleanField(default=False)
    info = CharField(max_length=250)

    user = OneToOneField(User, related_name='profile')

views.py

class OwnerProfileEdit(UpdateView):

    model = User
    form_class = UserForm
    success_message = 'Profilul a fost actualizat'

    def get_object(self, queryset=None):
        return self.request.user

    .....

    def form_valid(self, form):
        profile_form = UserProfileForm(self.request.POST)
        if profile_form.is_valid():
            profile_form.save(commit=False)
            profile_form.user = self.request.user
            profile_form.save()
        return super(OwnerProfileEdit, self).form_valid(form)

forms.py

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ('vendor_venue', 'user')

这是用于保存具有与用户的OneToOneField关系的用户个人资料的代码。

当我尝试保存个人资料时,我收到错误

(1048, "Column 'user_id' cannot be null")

为什么会这样?它不应该发生。我究竟做错了什么?谢谢 我指定如果我只使用UserForm,没有UserProfileForm,一切正常

感谢!!!

1 个答案:

答案 0 :(得分:1)

您正在视图中保存表单并添加用户,但是您仍然在调用超类form_valid,它会在没有您的用户的情况下再次执行相同操作。

请参阅the documentation,了解如何在此处设置用户,而不是执行该保存。

修改抱歉,我误解了您的问题。问题实际上是你需要将用户设置为form.save返回的模型实例,而不是表单本身。

        profile = profile_form.save(commit=False)
        profile.user = self.request.user
        profile.save()