我正在扩展用户模型,但似乎在使用我的新管理表单时出现问题。 我在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'
当用户不尝试在admin中控制首选项对象的值时,它可以正常工作,并使用默认值创建新用户。但是,如果用户试图切换到'list'的默认值并改为使用'grid',我会得到一个'Key userd for Key user_id'错误。
我是否需要显示从额外字段的管理表单中获取值并保存userprofile2对象和用户对象?如果是这样,那与我收到的错误有什么关系?我没有找到关于如何做到这一点的文档,并且非常欣赏任何方向。
更新: 这似乎也很重要:当我在UserProfile2模型中删除首选项的默认值时,我得到的错误是“列'preference_id'不能为空”
感谢您查看我的问题。
答案 0 :(得分:0)
您的信号会根据“created”的值在User对象的post_save上创建一个新的UserProfile2对象。我打赌每次调用此信号时'created'都为True,并且每次在admin中保存User对象上的任何信息时,它都会尝试创建一个新的UserProfile2对象。
UserProfile2的用户外键设置为唯一,这是您获得重复键错误的地方。
尝试将信号代码更改为:
def create_user_profile(sender, instance, created, **kwargs):
if created:
u = UserProfile2.objects.get_or_create(user=instance)
应该防止重复键错误。希望能帮到你。