当前位置: 首页 > 知识库问答 >
问题:

填写配置文件字段时,Django用户创建在管理中失败

沈俊美
2023-03-14

我正在使用Django 1.4。1使用postgresql 9.1。

我需要添加一个配置文件给用户与认证应用程序,并允许管理员应用程序创建和编辑此配置文件。因此,我一直遵循“文档”部分存储有关用户的其他信息:

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)
...
AUTH_PROFILE_MODULE = 'userprofile.UserProfile'
...

我还激活了INSTALLED_APPS中的django.contrib.authdjango.contrib.admin应用程序。

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)

现在,当我运行管理应用程序并要求添加(创建)一个新用户时,我被要求通过两个步骤创建我的用户:首先,一个页面只要求输入用户名、密码(两次)和我的两个UserProfile字段。

如果我只键入用户名和密码(两次),然后单击“保存”,我将显示该过程的第二页,这允许填写所有其他用户字段,以及我的用户配置文件字段。有一条消息说“用户“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”都会递增。

如何避免这种行为,或者如何防止配置文件字段在第一页中可编辑,但让它们在第二页中编辑?

完全回溯:

Environment:

Request Method: POST
Request URL: http://127.0.0.1:8000/admin/auth/user/add/

Django Version: 1.4.1
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'userprofile')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')

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

Exception Type: IntegrityError at /admin/auth/user/add/
Exception Value: duplicate key value violates unique constraint "userprofile_userprofile_user_id_key"
DETAIL:  Key (user_id)=(7) already exists.`

共有3个答案

甄阿苏
2023-03-14

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

傅博瀚
2023-03-14

而不是

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)

您正在创建新的用户配置文件对象,甚至用于编辑。

虞承泽
2023-03-14

正如CadentOrange在评论中提到的,这个问题的解决方案在这个答案中描述。

问题在于使用内联管理表单。下面是发生的情况:

  1. 它保存主模型(User
  2. 由于(1),触发了用户的post_save信号处理程序,这将创建一个新的UserProfile对象
  3. 保存每个内联模型(包括另一个副本的UserProfile,导致欺骗)。
 类似资料:
  • 问题内容: 我有一个领域模型: 在我的管理员中: 在这里,我不想在添加MyModel时在管理员中使用。我希望将其设置为当前用户,例如 我怎样才能做到这一点? 谢谢 问题答案: 您已经设置好了,因此它不会以Django管理员的形式出现。 现在,您需要覆盖,并在保存新对象之前设置用户。

  • 问题内容: 我在Django中有一个扩展的UserProfile模型: 还有一个signal.py: 我通过在我的:中确保信号被注册: 因此,应该为每个注册用户创建一个新的UserProfile,对吗?但事实并非如此。尝试登录时,总是出现“ UserProfile匹配查询不存在”错误,这意味着该数据库条目不存在。 我应该说我使用django-registration,它提供了user_regist

  • 问题内容: 我想为我的PHP项目创建一个配置文件,但是我不确定执行此操作的最佳方法是什么。 到目前为止,我有3个想法。 1用途变量 2用建筑 3用途数据库 我将在类中使用config,因此我不确定哪种方法是最佳方法,或者是否有更好的方法。 问题答案: 一种简单而优雅的方法是创建一个仅返回数组的文件(或您所谓的文件): 然后:

  • 问题内容: 我从我的android应用程序中的新功能开始,这将有助于填写某些PDF表格。 我发现最好的解决方案是使用iText库。 我可以读取文件,也可以从文档中读取AcroFields,但是是否有可能发现特定字段标记为必填项? 我试图在API文档和Internet上找到此选项,但是没有什么可以帮助解决此问题。 问题答案: 请查看我的书的 13.3.4节,标题为“ AcroForms重新访问”。清

  • 你怎能一口吃头大象呢?有时你会遇到这种情况,想要从被不同类管理的各种片段构建单一的配置文件。 例如,你可能有两到三个服务需要 rsync 模块配置,因此你不能只发布单一的配置文件 rsyncd.conf。 尽管你可以使用 Augeas,但是一种更简单的方法就是使用 exec 资源将若干配置片段串接成一个文件。 操作步骤 使用如下代码创建 /etc/puppet/modules/admin/mani

  • 我有一个PDF表单字段创建与Acrobat DC由我的客户。我使用Python pikepdf以编程方式填充这些字段。奇怪的问题是,有些字段填满了,而另一些字段没有填满。我用Acrobat DC检查了一遍又一遍:所有字段都有完全相同的文本字段属性,名称显然是唯一的。Python代码使用字段的正确名称来寻址这些字段。所以我怀疑问题可能与我的客户创建字段的方式有关。使用Acrobat DC,我删除了有