首页 > 解决方案 > 扩展 Django 用户模型 OneToOne - 用户配置文件未保存

问题描述

我正在尝试构建一个应用程序,允许用户注册并结识具有相似兴趣的其他用户。我正在使用 OneToOne 字段扩展用户模型,但在尝试注册某些用户时遇到问题:配置文件未保存。用户数据会保存,但配置文件数据不会。

我不明白我做错了什么,因为我按照教程编写程序。

这是我的Models.py文件:

class Profile(models.Model):
    GENDERS = (
        ('M', 'Male'),
        ('F', 'Female'),
    )

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    email = models.EmailField(max_length=254, blank=True)
    gender = models.CharField(choices=GENDERS, max_length=1, null=True, default='')
    dob = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True)
    hobby = models.ManyToManyField(Hobby)

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

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

post_save.connect(create_user_profile, sender=User)

这是我的forms.py文件:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('username', 'password', 'first_name', 'last_name')

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('email', 'gender', 'dob', 'hobby')

这是我的视图功能:

def register(request):
if request.method =="POST":
    userForm = UserForm(request.POST)
    profileForm = ProfileForm(request.POST)
    if userForm.is_valid() and profileForm.is_valid():
        userForm.save()
        profileForm.save()
        return redirect('/')
    else:
        return render(request, 'QMLove/register.html', {'userForm': userForm, 'profileForm': profileForm})
else:
    userForm = UserForm()
    profileForm = ProfileForm()
    return render(request, 'QMLove/register.html',{'userForm': userForm, 'profileForm': profileForm})

先感谢您!

标签: pythondjango

解决方案


您没有做任何事情来将您创建的配置文件与您创建的用户相关联。我希望要么创建两个配置文件,要么创建两个配置文件 - 一个为空,一个包含数据但与用户无关 - 或者配置文件表单保存失败并出现完整性错误,因为您没有提供用户。

您应该移除这些信号接收器,因为它们对您想要做的事情没有帮助,并且可能会产生冲突。相反,在保存配置文件时传递创建的用户:

user = userForm.save()
profile = profileForm.save(commit=False)
profile.user = user
profile.save()

推荐阅读