gpt4 book ai didi

python - Django allauth 使用注册表单保存自定义用户字段

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:58 25 4
gpt4 key购买 nike

我用 UserProfile 模型扩展了标准用户模型,具有以下字段:

class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
gender = models.CharField(max_length=30)
info = models.CharField(max_length=30)

但在使用此表单创建新用户时:

class SignupForm(forms.Form):
first_name = forms.CharField(max_length=30, label='First name')
last_name = forms.CharField(max_length=30, label='Last name')
info = forms.CharField(max_length=30, label='info')
def save(self, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
profile = UserProfile()
profile.user = user
profile.info = self.cleaned_data['info']
profile.save()
user.profile = profile
user.save()

数据库中的“信息”始终为空 ('')(除了 id 之外的任何其他字段也是如此)。标准属性(名字、姓氏)已正确保存。

我试过调试,错误与 SQL 无关,因为查询不正确:

INSERT INTO "user_profile" ("user_id", "info") VALUES (17, '',
'') RETURNING "user_profile"."id";

但是,当我使用 pdb 调试 user.profile.info 的值时,它工作正常:

(Pdb) user.profile.info
u'info passed from form'

最佳答案

应首先保存自定义表单,但将 commit 设置为 false,这样信息还不会进入数据库,之后可以保存用户字段,然后您可以设置一对一的字段链接这两个字段最终保存之前的表格

class SignupForm(forms.Form):    
def signup(self, user):
profile = UserProfile()
profile.save(commit = False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
user.profile = profile
profile.user = user
profile.info = self.cleaned_data['info']
profile.save()

顺便说一句,我们设置的是 profile.user 而不是 user.profile 在这种情况下,profile 是从父类(用户类)继承的子类

关于python - Django allauth 使用注册表单保存自定义用户字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com