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

时间:2014-01-24 16:37:38

标签: python django django-allauth

我使用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()

数据库中的'info'始终为空('')(除了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'

2 个答案:

答案 0 :(得分:2)

应首先保存自定义表单,但将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配置文件的方式是在这种情况下从父(User类)继承的子项

答案 1 :(得分:-1)

您正在覆盖错误的方法以保存用户信息。要覆盖的方法是signup而不是save

class SignupForm(forms.Form):
    ..........

    def signup(self, request, user):

        .....................