python - 扩展 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})
先感谢您!
解决方案
您没有做任何事情来将您创建的配置文件与您创建的用户相关联。我希望要么创建两个配置文件,要么创建两个配置文件 - 一个为空,一个包含数据但与用户无关 - 或者配置文件表单保存失败并出现完整性错误,因为您没有提供用户。
您应该移除这些信号接收器,因为它们对您想要做的事情没有帮助,并且可能会产生冲突。相反,在保存配置文件时传递创建的用户:
user = userForm.save()
profile = profileForm.save(commit=False)
profile.user = user
profile.save()
推荐阅读
- ajax - 为什么使用 laravel ajax 发送到控制器时 id 给出 null
- html - Jquery var迭代后DIV显示不起作用
- python - 在数组中找到局部最小值
- scala - 如何使用 Scala 学习 REST 和 DAO?
- bash - 使用 printf 从特定字母/符号输出字符串
- python - 如何在机器上未安装 VLC 的情况下初始化 python-vlc(便携式 VLC 实例)
- azure-active-directory - 使用 MailRead.Basic 范围创建 Graph API 订阅会在客户端凭据流上引发错误
- python - QPainterPath 形状,线条笔触在内部突出
- python - 如何在python中检查形状不兼容
- java - 从另一个表添加值