2011-07-25 5 views
0

私はユーザーモデルを拡張していますが、新しい管理フォームの使用に問題があるようです。 私はmodels.pyに次のコードを持っている:Djangoユーザーモデルのカスタマイズ時に新しい管理フォームを使用する

class Preference(models.Model): 
     choice = models.TextField(choices = (('grid', 'grid'), ('list','list'))) 

     def __unicode__(self): 
      return self.choice 

    class UserProfile2(models.Model): 
     preference = models.ForeignKey(Preference, default = Preference.objects.get(id=2).id) 
     user = models.OneToOneField(User, unique=True) 

    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      print 'creating user profile2' 
      u = UserProfile2.objects.create(user=instance) 

    post_save.connect(create_user_profile, sender=User) 

次のコードはadmin.pyである:

class UserProfileInline(admin.TabularInline): 
     model = UserProfile2 
     fk_name = 'user' 

    class CustomUserAdmin(UserAdmin): 
     inlines = [UserProfileInline,] 

    admin.site.unregister(User) 
    admin.site.register(User, CustomUserAdmin)  

次はsettings.pyである:

AUTH_PROFILE_MODULE = 'userextension.UserProfile2' 

それユーザーが管理者の設定オブジェクトの値を制御しようとしないときに正しく動作し、デフォルト値を使用して新しいユーザーが作成されます。しかし、ユーザーが 'list'のデフォルト値から離れて代わりに 'grid'を使用しようとすると、 'key user_id重複エントリ'エラーが表示されます。

追加フィールドの管理フォームから明示的に値を取得し、userprofile2オブジェクトとユーザーオブジェクトの両方を保存する必要がありますか?もしそうなら、私は受け取ったエラーにどのように関連していますか?私はそれを行う方法について多くの文書を見つけられておらず、どんな方向性も高く評価しています。

更新: これは、あまりにも、重要なようだ:私はUserProfile2モデルに設定のデフォルト値を削除すると、私が手にエラーがあり、「列 『preference_id』 nullにすることはできません」を見て取るため

感謝を私の質問。

答えて

0

あなたのシグナルは、 'created'の値に基づいてUserオブジェクトのpost_saveに新しいUserProfile2オブジェクトを作成します。私は、このシグナルが呼び出されるたびに「作成されました」がTrueであることを賭けており、adminのUserオブジェクトの情報を保存するたびに新しいUserProfile2オブジェクトを作成しようとしています。

UserProfile2のユーザー外部キーが重複キーエラーを取得するユニークに設定されています。 重複キーエラーを防ぐ必要があることを

def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      u = UserProfile2.objects.get_or_create(user=instance) 

はあなたに信号コードを変更してみてください。それがあなたを助けることを願っています。

+0

あなたの答えはありがたいですが、上記のデバッグステートメントは、新しいユーザーが作成されたときにのみ表示され、既存のユーザーが変更されたときには表示されません。だから、「作成された」というのはその仕様に従って動作するようです。 – user773328

+0

よかったです。私はデバッグのためだけにFalseにユニークを設定し、インラインが新しいレコードを作成しているかどうか、または 'preference'の値を変更するときに既存のレコードを更新しているかどうかを確認します。 – Brandon

関連する問題