如果存在实例,则内联管理员会忽略max_num和extra

时间:2011-09-25 16:11:01

标签: python django

我使用UserProfile扩展了标准Django User模型,并创建了从UserProfile到User的OneToOne关系,如下所示:

class UserProfile(models.Model):
    user = models.OneToOneField(adminmodels.User)
    about = models.TextField('About the author', blank=True)
    picture = models.ImageField('Picture (70px x 70px)', blank=True, upload_to='uploads/profile_pics', default='noone.png')
    user_site = models.URLField(blank=True, verify_exists=False)

class Meta:
    verbose_name = "Profiel"
    verbose_name_plural = "Profielen"

要获取用户管理员中包含的相应管理员表单,我创建了一个内联管理员表单,并将其添加到用户管理员,如下所示:

# Inline admin for the user profile
class UserProfileInline(admin.StackedInline):
    model = UserProfile
    fk_name = 'user'
    max_num = 1
    extra = 0

# Include the extra form
class MyUserAdmin(admin.ModelAdmin):
      inlines = [UserProfileInline, ]

# Re-register the user form
admin.site.unregister(admin.models.User)
admin.site.register(admin.models.User, MyUserAdmin)

最后,为了保存UserProfile的实例,我有一个连接到postave的函数。它看起来像这样:

def on_user_was_saved(sender,instance,created,using,*args,**kwargs):
    if type(instance) == adminmodels.User:    
        if created:
            profile = UserProfile.objects.get_or_create(user = instance)
            profile.save()
        else:
            profile = UserProfile.objects.get_or_create(user = instance)
            profile[0].save()

现在,有两件事出了问题:

  1. 使用用户个人资料字段中的任何内容保存用户时,将保存用户,UserProfile的实例也是如此,但实例已保存,就像所有字段都为空一样。在这些字段中输入新内容时,您可以保存,但没有任何问题。
  2. UserProfile表单的第二个实例变为可用; max_num被忽略。
  3. 在benjaoming的输入之后我将post_save回调改为:

        try:
            profile = UserProfile.objects.get(user = instance)
            profile.save()
        except:
            profile = UserProfile.objects.get_or_create(user = instance)
            profile[0].save()
    

    然而,这并没有解决我已经遇到的任何问题。

1 个答案:

答案 0 :(得分:1)

这里的主要问题是您实际上并未处理个人资料表单。查看您编写的代码:您没有任何内容可以获取您为用户配置文件输入的值并将其保存到数据库中。

此外,admin.StackedInline不是为了您尝试使用它而构建的。它管理一对多的关系,而不是一对一的关系。

如果您必须在管理员中使用该功能,请完全遵循您概述的设置,最好的方法是向AdminSite添加自定义视图,其中包含用于添加和编辑用户的表单。或者,让人们编辑两个表单来创建用户。

无论如何,您可以阅读有关adding views to an AdminSite的更多信息。