我使用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()
现在,有两件事出了问题:
try:
profile = UserProfile.objects.get(user = instance)
profile.save()
except:
profile = UserProfile.objects.get_or_create(user = instance)
profile[0].save()
然而,这并没有解决我已经遇到的任何问题。
答案 0 :(得分:1)
这里的主要问题是您实际上并未处理个人资料表单。查看您编写的代码:您没有任何内容可以获取您为用户配置文件输入的值并将其保存到数据库中。
此外,admin.StackedInline
不是为了您尝试使用它而构建的。它管理一对多的关系,而不是一对一的关系。
如果您必须在管理员中使用该功能,请完全遵循您概述的设置,最好的方法是向AdminSite
添加自定义视图,其中包含用于添加和编辑用户的表单。或者,让人们编辑两个表单来创建用户。
无论如何,您可以阅读有关adding views to an AdminSite
的更多信息。