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' 

当用户不尝试在管理员中控制偏好对象的值时,它可以正常工作,并使用默认值创建新用户。但是,如果用户尝试从“list”的默认值切换并改用“grid”,我会收到“Key user_id 的重复条目”错误。

我是否需要从管理表单中显式获取额外字段的值并保存 userprofile2 对象和 user 对象?如果是这样,这与我收到的错误有什么关系?我还没有找到太多关于如何做到这一点的文档,并且非常感谢任何方向。

更新:这似乎也很重要:当我在 UserProfile2 模型中删除首选项的默认值时,我得到的错误是“列'preference_id'不能为空”

感谢您查看我的问题。

4

1 回答 1

0

您的信号根据“created”的值在用户对象的 post_save 上创建一个新的 UserProfile2 对象。我打赌每次调用此信号时“created”都是 True,并且每次您在管理员中保存有关 User 对象的任何信息时,它都会尝试创建一个新的 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 回答