Django-Userena:为用户的个人资料添加额外的非空字段

时间:2012-01-30 20:08:12

标签: python django

是否有一种简单的方法来允许所需的个人资料字段?

我在当前的django项目中使用userena。我有一个名为UserProfile的自定义配置文件,它有一个start_year非空,非空字段,定义如下。

class UserProfile(UserenaBaseProfile, PybbProfile):
    user = models.OneToOneField(User, unique=True,
                        verbose_name=_('user'),
                        related_name='user_profile')

    start_year = models.IntegerField(max_length=4)

我需要在注册时填写此内容。我创建了一个如下定义的SignupExtraForm,以覆盖默认表单。

class SignupFormExtra(SignupForm):
    start_year = forms.IntegerField(label=_(u'Initiation Year'),
                            min_value=1800,
                            max_value=datetime.now().year,
                            required=True)

    def save(self):
        new_user = super(SignupFormExtra, self).save()

        new_user_profile = new_user.get_profile()

        new_user_profile.start_year = self.cleaned_data['start_year']
        new_user_profile.save()

        # Userena expects to get the new user from this form, so return the new
        # user.
        return new_user

当我尝试通过现在修改的表单添加新用户时,我收到以下错误:

profile_userprofile.start_year may not be NULL

在上面的代码中,堆栈跟踪指向new_user = super(SignupFormExtra, self).save())

我认为在我能够从表单中提供所需数据之前,这与创建和保存的用户配置文件有关。有没有一种简单的方法可以将这些数据提供给user_creation过程,或者延迟创建用户配置文件?

由于 SHON

1 个答案:

答案 0 :(得分:0)

UserProfile信号保存User后创建

post_save。即使您使用自己的信号覆盖它,也无法从那里访问表单数据。

最简单的解决方案是让start_year为NULL。没有必要在数据库级别强制执行此操作,并且您可以以任何方式使所有表单都需要该字段:

start_year = models.IntegerField(max_length=4, blank=False, null=True)

您的自定义表单已强制要求该字段,因此您已完成。

更新(来自评论)

自定义表单,是的,但您仍然可以使用ModelForm

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['start_year'].required = True

更新(再次)

实际上,在我上次更新之前,我没有想到。我在我的示例中将blank=False放在start_year字段上。这将强制默认情况下所有ModelForm中都需要该字段。您根本不需要自定义ModelForm。但是,我为后代留下了以前的更新。