向django-userena表单添加额外的字段

时间:2012-01-15 06:47:47

标签: python django registration

我正在使用django-userena。我有一个名为UserProfile的模型。我在注册表单中添加了额外的字段。并且这些字段显示正确但不保存数据。我想将一些字段数据保存到另一个模型(Business)中。例如,我有两个字段,如contactbusiness。我希望联系人字段转到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模型上 - 一个绑定到用户的实例

2 个答案:

答案 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