是否有一种简单的方法来允许所需的个人资料字段?
我在当前的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
答案 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
。但是,我为后代留下了以前的更新。