4

私はpostgresql9.1でDjango1.4.1を使用しています。

authアプリで指定されたユーザーにプロファイルを追加し、管理者アプリがこのプロファイルを作成および編集できるようにする必要があります。したがって、私はドキュメントセクションに従っていますユーザーに関する追加情報の保存

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)

    bio = models.TextField(null = True, blank = True)
    contact = models.TextField(null = True, blank = True)

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

settings.py

...
AUTH_PROFILE_MODULE = 'userprofile.UserProfile'
...

django.contrib.authでとdjango.contrib.adminアプリもアクティブにしましたINSTALLED_APPS

admin.py

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'profile'

class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

問題

ここで、管理アプリを実行して新しいユーザーを追加(作成)するように要求すると、 2つのステップのプロセスでユーザーを作成するように求められます。最初に、ユーザー名、パスワード(2回)、および私の2つのUserProfileフィールド。

ユーザー名とパスワードのみ(2回)を入力して[保存]をクリックすると、プロセスの2ページ目が表示され、他のすべてのユーザーフィールドとユーザープロファイルフィールドに入力できます。「ユーザー「xxxxx」が正常に追加されました。以下で再度編集できます。」というメッセージが表示されます。幸い、両方のモデルのフィールドを編集できます。これで機能します。

しかし、最初のページのUserProfileフィールドの一方または両方に何かを入力しようとすると、送信は次のメッセージで失敗します。

IntegrityError at /admin/auth/user/add/

duplicate key value violates unique constraint "userprofile_userprofile_user_id_key"
DETAIL:  Key (user_id)=(7) already exists.

「7」は、試すたびにインクリメントされます。

この動作を回避するにはどうすればよいですか。あるいは、プロファイルフィールドを最初のページで編集可能にせず、2番目のページで編集できるようにするにはどうすればよいですか。

完全なトレースバック:

環境:

リクエスト方法:POST
リクエストURL:http://127.0.0.1:8000/admin/auth/user/add/

Djangoバージョン:1.4.1
Pythonバージョン:2.7.3
インストールされているアプリケーション:
('django.contrib.auth'、
 'django.contrib.contenttypes'、
 'django.contrib.sessions'、
 'django.contrib.messages'、
 'django.contrib.staticfiles'、
 'django.contrib.admin'、
 'django.contrib.admindocs'、
 'userprofile')
インストールされているミドルウェア:
('django.middleware.common.CommonMiddleware'、
 'django.contrib.sessions.middleware.SessionMiddleware'、
 'django.middleware.csrf.CsrfViewMiddleware'、
 'django.contrib.auth.middleware.AuthenticationMiddleware'、
 'django.contrib.messages.middleware.MessageMiddleware')

トレースバック:
get_responseのファイル「/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py」
  111. response = callback(request、* callback_args、** callback_kwargs)
ラッパー内のファイル「/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py」
  366. return self.admin_site.admin_view(view)(* args、** kwargs)
_wrapped_viewのファイル「/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py」
  91. response = view_func(request、* args、** kwargs)
_wrapped_view_funcのファイル"/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py"
  89. response = view_func(request、* args、** kwargs)
内部のファイル「/usr/local/lib/python2.7/dist-packages/django/contrib/admin/sites.py」
  196. return view(request、* args、** kwargs)
sensitive_post_parameters_wrapperのファイル「/usr/local/lib/python2.7/dist-packages/django/views/decorators/debug.py」
  69. return view(request、* args、** kwargs)
_wrapperのファイル"/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py"
  25. return bound_func(* args、** kwargs)
_wrapped_viewのファイル「/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py」
  91. response = view_func(request、* args、** kwargs)
bound_funcのファイル「/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py」
  21. return func(self、* args2、** kwargs2)
内部のファイル「/usr/local/lib/python2.7/dist-packages/django/db/transaction.py」
  209. return func(* args、** kwargs)
add_viewのファイル「/usr/local/lib/python2.7/dist-packages/django/contrib/auth/admin.py」
  114. extra_context)
_wrapperのファイル"/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py"
  25. return bound_func(* args、** kwargs)
_wrapped_viewのファイル「/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py」
  91. response = view_func(request、* args、** kwargs)
bound_funcのファイル「/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py」
  21. return func(self、* args2、** kwargs2)
内部のファイル「/usr/local/lib/python2.7/dist-packages/django/db/transaction.py」
  209. return func(* args、** kwargs)
add_viewのファイル「/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py」
  956. self.save_related(request、form、formsets、False)
save_relatedのファイル「/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py」
  733. self.save_formset(request、form、formset、change = change)
save_formsetのファイル「/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py」
  721. formset.save()
保存中のファイル「/usr/local/lib/python2.7/dist-packages/django/forms/models.py」
  497. return self.save_existing_objects(commit)+ self.save_new_objects(commit)
save_new_objectsのファイル「/usr/local/lib/python2.7/dist-packages/django/forms/models.py」
  628. self.new_objects.append(self.save_new(form、commit = commit))
save_newのファイル「/usr/local/lib/python2.7/dist-packages/django/forms/models.py」
  731. obj.save()
保存中のファイル「/usr/local/lib/python2.7/dist-packages/django/db/models/base.py」
  463. self.save_base(using = using、force_insert = force_insert、force_update = force_update)
save_baseのファイル「/usr/local/lib/python2.7/dist-packages/django/db/models/base.py」
  551. result = manager._insert([self]、fields = fields、return_id = update_pk、using = using、raw = raw)
_insertのファイル"/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py"
  203. return insert_query(self.model、objs、fields、** kwargs)
insert_queryのファイル「/usr/local/lib/python2.7/dist-packages/django/db/models/query.py」
  1576. return query.get_compiler(using = using).execute_sql(return_id)
execute_sqlのファイル「/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py」
  910. cursor.execute(sql、params)
実行中のファイル「/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py」
  40. return self.cursor.execute(sql、params)
実行中のファイル「/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py」
  52. return self.cursor.execute(query、args)

例外タイプ:/ admin / auth / user /add/のIntegrityError
例外値:重複するキー値が一意の制約「userprofile_userprofile_user_id_key」に違反しています
詳細:キー(user_id)=(7)はすでに存在します。`
4

3 に答える 3

4

それ以外の

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

する

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

編集用であっても、新しいユーザープロファイルオブジェクトを作成しています。

于 2012-10-08T15:38:50.587 に答える
4

CadentOrangeがコメントで述べたように、この問題の解決策はこの回答に記載されています。

問題は、インライン管理フォームの使用にあります。何が起こるかです:

  1. メインモデルを保存します(User
  2. (1)により、のpost_saveシグナルハンドラUserが起動され、新しいUserProfileオブジェクトが作成されます
  3. 各インラインモデルが保存されます(の別のコピーを含むUserProfileため、重複が発生します)。
于 2013-06-11T15:54:51.657 に答える
2

シグナルと管理フォームはcreate_user_profile同じUserProfileを作成しようとします。追加ビューからLocalUserAdminを除外するようにオーバーライドできます。UserProfileInline

class LocalUserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

    def get_formsets_with_inlines(self, request, obj=None):
        for inline in self.get_inline_instances(request, obj):
            # hide MyInline in the add view
            if isinstance(inline, UserProfileInline) and obj is None:
                continue
            yield inline.get_formset(request, obj), inline

https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_formsets_with_inlinesを参照してください

于 2013-01-22T09:19:48.543 に答える