扩展Django用户模型OneToOne-用户配置文件未保存

时间:2018-11-29 11:19:51

标签: python django

我正在尝试构建一个允许用户注册并结识具有类似兴趣的其他用户的应用程序。我正在使用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})

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您尚未执行任何操作将创建的个人资料与创建的用户相关联。我希望创建两个配置文件,两个创建一个-一个为空,一个包含数据但不与用户相关联-或因为您不提供用户而导致配置文件表单保存由于完整性错误而失败。

您应该删除那些信号接收器,因为它们对您要执行的操作没有帮助,并且可能会产生冲突。而是在保存个人资料时传递创建的用户:

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