0

ユーザー モデルを拡張していますが、新しい管理フォームの使用に問題があるようです。models.py に次のコードがあります。

    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' 

ユーザーが管理者の設定オブジェクトの値を制御しようとせず、デフォルト値を使用して新しいユーザーを作成する場合、これは正しく機能します。しかし、ユーザーがデフォルト値の「リスト」から切り替えて代わりに「グリッド」を使用しようとすると、「キー user_id のエントリが重複しています」というエラーが発生します。

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

更新: これも重要なようです: UserProfile2 モデルの設定のデフォルト値を削除すると、「Column 'preference_id' cannot be null」というエラーが表示されます

私の質問を見てくれてありがとう。

4

1 に答える 1

0

シグナルは、'created' の値に基づいて、User オブジェクトの post_save で新しい UserProfile2 オブジェクトを作成します。このシグナルが呼び出されるたびに 'created' が True であり、ユーザー オブジェクトに関する情報を管理者に保存するたびに新しい UserProfile2 オブジェクトを作成しようとしているに違いありません。

UserProfile2 のユーザー外部キーが一意に設定されているため、重複キー エラーが発生しています。

シグナル コードを次のように変更してみてください。

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

重複キーエラーを防ぐ必要があります。それがあなたを助けることを願っています。

于 2011-07-25T15:59:42.570 に答える