如何在Django管理后台预填充用户资料字段?
在管理后台预填充大部分模型字段(这对生成网址后缀很有用)看起来很简单,只要你使用:
prepopulated_fields = {"slug": ("name",)}
但是,当我使用下面的代码尝试预填充一个用户资料字段时,出现了这个错误信息,尽管我在用户资料模型中确实有一个网址后缀字段。 (它只是查找了错误的模型,我不知道该怎么修复这个问题...)
错误信息:
在 /admin/ 出现配置错误
'UserProfileAdmin.prepopulated_fields' 指向的字段 'slug' 在模型 'User' 中缺失。
在 settings.py 文件中:
AUTH_PROFILE_MODULE = 'myapp.UserProfile'
在 models.py 文件中:
class UserProfile(models.Model):
user = models.OneToOneField(User)
slug = models.SlugField(max_length=50)
在 admin.py 文件中:
class UserProfileInline(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
class UserProfileAdmin(admin.ModelAdmin):
inlines = [UserProfileInline]
prepopulated_fields = {"slug": ("name",)}
admin.site.unregister(User)
admin.site.register(User, UserProfileAdmin)
有没有人能找出这里错误的原因?
1 个回答
2
slug
是 UserProfile
里的一个字段,但 prepopulated_fields = {"slug": ("name",)}
是 UserProfileAdmin
的一个属性,这个属性是应用在 User
上的。
prepopulated_fields
会触发一些 JavaScript 代码,这些代码会根据同一个模型里其他字段的值自动生成一个 SlugField 的值。你现在尝试的是在一个 不同模型 的字段里进行预填充。UserProfileAdmin
是应用在 User
上的,而 prepopulated_fields
指的是 slug
字段,这个字段在 User
模型中是不存在的。它是在 UserProfile
中定义的。
所以我认为这里最大的问题在于名字 UserProfileAdmin
,它应该叫 UserAdmin
。不要把 prepopulated_fields
应用的模型和内联的模型搞混。即使有一对一的关系,它们仍然是不同的模型。