2012-01-30 89 views
4

有沒有簡單的方法來允許所需的配置文件字段?Django-Userena:將額外的非空字段添加到用戶的配置文件

我在當前的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

UserProfileUserpost_save信號保存之後被創建。即使你用自己的信號覆蓋它,你也無法從那裏訪問表單數據。

最簡單的解決方案是隻允許start_year爲NULL。這是沒有必要在數據庫級別來執行這一點,你可以在所有形式的要求不管怎樣領域:

start_year = models.IntegerField(max_length=4, blank=False, null=True) 

您的自定義窗體已經強制執行該字段是必須的,這樣就大功告成了。

UPDATE(從評論)

自定義形式,是的,但你仍然可以使用一個ModelForm

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     self.fields['start_year'].required = True 

UPDATE(再次)

其實,我沒有」在我上次更新之前,請先考慮。在我的示例中,我在start_year字段上放置blank=False。這將強制默認情況下在所有ModelForm s中都需要該字段。根本不需要自定義ModelForm。但是,我留下了以前的更新後人。

+0

Userena不使用signal.The'UserProfile'在實際建立post_save的時候'UserenaManager.create_user()',是所謂的'SignupForm.save()'。 – sarkybogmozg 2012-01-30 22:55:22

+0

你是對的,我想到了這一點,但它對我來說似乎很骯髒。我希望我錯過了一些設置或其他東西... – sarkybogmozg 2012-01-30 22:58:50

+0

對不起,我想這個問題。當爲配置文件設置編輯時,我將被迫使用自定義表單而不是ModelForm,因爲該字段不會強制進行驗證。 – sarkybogmozg 2012-01-31 00:34:59

相關問題