如何在Django管理后台预填充用户资料字段?

1 投票
1 回答
2391 浏览
提问于 2025-04-16 11:55

在管理后台预填充大部分模型字段(这对生成网址后缀很有用)看起来很简单,只要你使用:

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

slugUserProfile 里的一个字段,但 prepopulated_fields = {"slug": ("name",)}UserProfileAdmin 的一个属性,这个属性是应用在 User 上的。

prepopulated_fields 会触发一些 JavaScript 代码,这些代码会根据同一个模型里其他字段的值自动生成一个 SlugField 的值。你现在尝试的是在一个 不同模型 的字段里进行预填充。UserProfileAdmin 是应用在 User 上的,而 prepopulated_fields 指的是 slug 字段,这个字段在 User 模型中是不存在的。它是在 UserProfile 中定义的。

所以我认为这里最大的问题在于名字 UserProfileAdmin,它应该叫 UserAdmin。不要把 prepopulated_fields 应用的模型和内联的模型搞混。即使有一对一的关系,它们仍然是不同的模型。

撰写回答