我正在使用django-userena
。我有一个名为UserProfile
的模型。我在注册表单中添加了额外的字段。并且这些字段显示正确但不保存数据。我想将一些字段数据保存到另一个模型(Business
)中。例如,我有两个字段,如contact
和business
。我希望联系人字段转到UserProfile
模型,business
字段将转到Business Model
。任何线索?谢谢
这是我的代码
class SignupFormExtra(SignupForm):
address = forms.CharField(label=_(u'Address'),max_length=30,required=False)
contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False)
business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False)
def save(self):
"""
Override the save method to save the first and last name to the user
field.
"""
user_profile = super(SignupFormExtra, self).save(commit=False)
user_profile.address = self.cleaned_data['address']
user_profile.contact = self.cleaned_data['contact']
user_profile.business = self.cleaned_data['business']
user_profile.save()
return user_profile
更新:我将这些值存储在用户实例上...我想将它们存储在Profile模型上 - 一个绑定到用户的实例
答案 0 :(得分:10)
Userena的作者。我已经收到了与#34; no_access"的电子邮件通信,但是如果其他人遇到同样的问题,那么它应该指向解决方案。第一个错误是save
方法返回一个配置文件。这不是真的,它返回一个Django User
。因此,您首先必须获取配置文件并对其进行更改。保存配置文件,然后再次返回用户以使其与Userena兼容。
对于Business
模型,只需将其添加到save
方法中。
class SignupFormExtra(SignupForm):
address = forms.CharField(label=_(u'Address'),max_length=30,required=False)
contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False)
business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False)
def save(self):
"""
Override the save method to save the first and last name to the user
field.
"""
# Original save method returns the user
user = super(SignupFormExtra, self).save()
# Get the profile, the `save` method above creates a profile for each
# user because it calls the manager method `create_user`.
# See: https://github.com/bread-and-pepper/django-userena/blob/master/userena/managers.py#L65
user_profile = user.get_profile()
# Be sure that you have validated these fields with `clean_` methods.
# Garbage in, garbage out.
user_profile.address = self.cleaned_data['address']
user_profile.contact = self.cleaned_data['contact']
user_profile.save()
# Business
business = self.cleaned_data['business']
business = Business.objects.get_or_create(name=business)
business.save()
# Return the user, not the profile!
return user
创建表单后,不要忘记在urls.py中覆盖userena表单。这样的事情会做:
url(r'^accounts/signup/$',
userena_views.signup,
{'signup_form': SignupFormExtra}),
应该这样做!祝你好运。
答案 1 :(得分:1)
我尝试过上述技巧,但似乎确实有效。但是,我遇到了一个错误,并且从未进入我的安装中的保存功能。我的设置文件中有此设置: USERENA_WITHOUT_USERNAMES =真 因此,当我扩充表单以包含新字段时,我从未进入save方法,因为我得到'field required',这是我不使用的字段(用户名)。
我在视图中看到了这里的行: 如果userena_settings.USERENA_WITHOUT_USERNAMES和(signup_form == SignupForm): signup_form = SignupFormOnlyEmail 因此,我将示例更改为继承SignupFormOnlyEmail而不是SignupForm并且它可以工作。因此,如果您使用USERENA_WITHOUT_USERNAMES,如果您想更改注册表单,请为其他表单创建子类。
我意识到这并没有回答这个问题(确切地说),但它确实如此: - )
-g