Django管理员内联表不会将值发布到一对一的关系

时间:2017-09-08 02:21:53

标签: python django signals inline models

对于这个令人费解的问题感到抱歉,但我是一名未经过任何培训而被投入Django框架的单身学生,我会在短时间内尽力理解这一切。我真的很喜欢Django,但我无法弄清楚我遇到的一个问题。

因此,对于分配,我需要扩展默认的admin users表以包含更多字段。这就是我所做的:

模型:

class UserInfo(models.Model):
    user = models.OneToOneField(User, 
    on_delete=models.CASCADE)
    userTypeID = models.ForeignKey(UserType)
    dob = models.DateField()
    contactNumber = models.IntegerField()
    address = models.CharField(max_length=50)

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        UserInfo.objects.create(user=instance)
        UserInfo.save(instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.userinfo.save()

def __str__(self):
    return str(self.user)

管理员:

class UserInfoInline(admin.StackedInline):
model = UserInfo

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

admin.site.register(UserType)
admin.site.register(City)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

这会在管理面板中显示我正在寻找的额外字段。但是,当我尝试添加新用户并选择其中一个userTypes(OneToOneField)时,我得到:

  

/ admin / auth / user / add /中的IntegrityError   (1048,"列' userTypeID_id'不能为空")

现在我了解我的信号接收器' (据我所知,他们)缺少一些可以解决的问题,但我不确定是什么。

任何帮助都会受到赞赏,因为我是新手,试着向我解释,好像我一无所知(因为我基本上不会哈哈)

1 个答案:

答案 0 :(得分:0)

您需要发布完整的追溯!

当您阅读Traceback时,您会看到此代码是跟踪帧的一部分:

UserInfo.objects.create(user=instance)

这个问题?它只是试图在没有userTypeID的情况下保存UserInfo!试试这个:

# make your default UserType object
default_user_type, created = UserType.objects.get_or_create(name='default')
UserInfo.objects.create(user=instance, UserTypeID=default_user_type)

另一种方法是只添加默认值,以便在创建对象时不想填写的列。