Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Userena:向用户添加额外的非空字段';s剖面图_Python_Django - Fatal编程技术网

Python Django Userena:向用户添加额外的非空字段';s剖面图

Python Django Userena:向用户添加额外的非空字段';s剖面图,python,django,Python,Django,是否有一种简单的方法允许使用所需的配置文件字段 我在当前的django项目中使用userena。我有一个名为UserProfile的自定义配置文件,它有一个start_year none空的非空字段,定义如下 class UserProfile(UserenaBaseProfile, PybbProfile): user = models.OneToOneField(User, unique=True, verbose_name=_('us

是否有一种简单的方法允许使用所需的配置文件字段

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

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\u user=super(SignupFormExtra,self).save())

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

谢谢
Shon

UserProfile
是在通过
post\u save
信号保存
用户后创建的。即使您用自己的信号覆盖它,您也无法从那里访问表单数据

最简单的解决方案是只允许
start\u year
为空。无需在数据库级别强制执行此操作,您可以通过以下任一方式在所有表单中设置必填字段:

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\u year
字段中。这将强制默认情况下所有
ModelForm
s中都需要该字段。您根本不需要自定义的
ModelForm
。然而,我把以前的更新留给了后代

Userena不使用post_save信号。
UserProfile
实际上是在when
UserenaManager中创建的。create_user()
,是在
SignupForm.save()
中调用的。你的回答是正确的,我也想到了这一点,但对我来说,这似乎很肮脏。我希望我错过了一些设置或其他东西…很抱歉想到了这个问题。设置配置文件编辑时,我将被迫使用自定义表单而不是模型表单,因为该字段不会强制验证。请参阅上面的我的更新。我给了您一个示例
ModelForm
,如果您真的需要它,您可以使用它,但是
blank=False
参数使该字段成为表单所需的字段,因此它是不必要的。谢谢!我不理解blank vs null在ModelForms中是如何工作的。