2012-01-30 6 views
4

必要なプロファイルフィールドを許可する簡単な方法はありますか?Django-Userena:ユーザーのプロファイルにnull以外のフィールドを追加する

現在のdjangoプロジェクトでuserenaを使用しています。私はUserProfileという名前のカスタムプロファイルを持っています。このプロファイルは、start_year none-blank、null以外のフィールドを持っています。

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 

私は、私は以下のエラーを取得し、今修正された形を通して、新しいユーザーを追加しようと

:上記のコードで new_user = super(SignupFormExtra, self).save())を指しスタックトレース、と

profile_userprofile.start_year may not be NULL 

これは、フォームから必要なデータを得る前に、作成および保存されているユーザープロファイルと関係があると思います。このデータをuser_creationプロセスに供給するか、ユーザープロファイルの作成を遅らせるかは簡単ですか? Userpost_save信号によって保存された後

おかげ SHON

答えて

0

UserProfileが作成されます。独自の信号でオーバーライドしても、そこからフォームデータにアクセスすることはできません。

最も簡単な解決策は、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(再び)

実は、私は」didnの私の最後の更新前に考える。私は例のstart_yearフィールドにblank=Falseを入れました。それはフィールドがすべてModelFormに必須であることを強制するでしょう。カスタムModelFormは必要ありません。しかし、私は後世のために前のアップデートを残しました。

+0

Userenaはpost_save信号を使用しません。 'UserProfile'は' UserenaManager.create_user() 'が' SignupForm.save() 'で呼び出されたときに実際に作成されます。 – sarkybogmozg

+0

あなたは正しいと私はこれを考えましたが、それはちょうど私に汚れているようです。私はいくつかの設定や他の何かを逃したことを望んでいます... – sarkybogmozg

+0

残念これの問題を考えました。プロファイルの編集を設定するとき、フィールドは検証を強制しないため、ModelFormの代わりにカスタムフォームを使用するよう強制されます。 – sarkybogmozg

関連する問題