gpt4 book ai didi

python - Django-Userena : adding extra non-null fields to a user's profile

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

是否有一种简单的方法允许必填的配置文件字段?

我在当前的 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 进程,或延迟用户配置文件的创建?

谢谢顺

最佳答案

UserProfile 是在 Userpost_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。但是,我为后代留下了以前的更新。

关于python - Django-Userena : adding extra non-null fields to a user's profile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070075/

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