【发布时间】:2013-02-24 20:30:08
【问题描述】:
我看到 Django 用户配置文件创建错误,之前已被询问过几次,但其他问题的解决方案和 Django docs recommended 修复不起作用。
我有一个 UserProfile 模型,我在从 Django 管理页面创建新用户对象时尝试创建它。(请原谅我这里的语法,我已经有一段时间没有使用堆栈溢出了)
class UserProfile(models.Model):
user = models.OneToOneField(User)
organization = models.IntegerField(null=True)
phone = models.CharField(max_length=20, null=True, blank=True)
phone_ext = models.CharField(max_length=8, null=True, blank=True)
team_no = models.CharField(max_length=30, null=True, blank=True)
post_save.connect(create_user_profile, sender=User, dispatch_uid="a.unique.string.that.does.not.help.me")
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
我已将用户配置文件添加到 UserAdmin 类并取消注册/注册管理站点条目。
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name_plural = 'profile'
class UserAdmin(UserAdmin):
inlines = (UserProfileInline, )
actions = [set_organization]
exclude = ('is_staff',)
try:
admin.site.unregister(User)
admin.site.unregister(RegistrationProfile)
admin.site.unregister(Group)
## Re-register UserAdminadmin.site.unregister(User)
finally:
admin.site.register(User, UserAdmin)
admin.site.register(RegistrationProfile, RegistrationAdmin)
admin.site.register(Group, GroupAdmin)
因此,每次我尝试创建新用户时,我总是会收到 user_profile_user_id 字段的重复键错误。查看日志,在用户保存时运行了两个插入语句。第一个是缺少在管理界面中的用户配置文件字段中输入的所有数据。第二个拥有所有数据但失败了,因为已经有了只有他的 user_id 的初始插入。
我已经在项目中搜索了几次,寻找我的 models.py 的 UserProfile 类的重复导入,但一无所获。
这里有人有什么想法吗?
谢谢。
--更新--
Django 版本是 1.3
imports in the profile/models.py
from django.contrib.auth.models import User
from django.db.models.signals import post_save, pre_save
import logging
从 admin.py 导入 从 django.contrib 导入管理员 从 django.contrib.auth.models 导入组 从 test.django.registration.models 导入 RegistrationProfile 从 test.django.registration.admin 导入 RegistrationAdmin 从 django.contrib.auth.admin 导入 UserAdmin、GroupAdmin 从 django.contrib.auth.models 导入用户 从 test.django.extranet.profile.models 导入 UserProfile 从 test.django.common.models.ajrsonline.ajrsonline_users 导入 AjrsonlineUsers 从 test.django.common.middleware.ajrs_ldap 导入 AJRSOnlineLdapBackend
【问题讨论】:
-
什么版本的 Django,你能发布你的导入吗?
-
Glyn,感谢您的回复,我已经检查了问题 2345400,更改已安装应用程序的条目并没有改变任何内容。
-
为什么你有一个信号和一个创建配置文件的 lambda?这个问题显然与那个 get_or_create 调用有关。我真的不明白设计选择。我敢打赌,在 Django 的某个深处,您遇到了正在访问该属性的条件(因此创建了记录),然后信号正在触发,您也在尝试创建记录。 Django 没有捕捉到已经创建的记录,所以它会尝试再次创建它。那个奇怪的属性很奇怪。我不明白。
-
杰克,lambda 在那里自动创建配置文件,这就是问题所在。每次调用该方法时,都会创建一个空配置文件,然后第二个 get_or_create 使用表单数据运行。如果您愿意,请创建一个答案,我会选择它,因为我不想让问题无人回答。
标签: django django-admin signals