开发者

How to prepopulate UserProfile fields in the Django admin?

Prepopulating most model fields in the admin (useful for generating slugs) seems to be straightforward if you use:

prepopulated_fields = {"slug": ("name",)}  

But when I use the code below to try to prepopulate a UserProfile field, it gives this error message, even though I clearly have a slug in the UserProfile model. (It's just looking in the wrong model and I don't know how to fix this...)

ERROR:

ImproperlyConfigured at /admin/

'UserProfileAdmin.prepopulated_fields' refers to field 'slug' that is missing from model 'User'.

In settings.py:

AUTH_PROFILE_MODULE = 'myapp.UserProfile'

In models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    slug = models.SlugField(max_length=50)

In admin.py:

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    max_num = 1
    can_delete 开发者_JAVA百科= False

class UserProfileAdmin(admin.ModelAdmin):
    inlines = [UserProfileInline]
    prepopulated_fields = {"slug": ("name",)}

admin.site.unregister(User)
admin.site.register(User, UserProfileAdmin)  

Can anyone spot reason for the error here?


slug is a field in UserProfile, but the prepopulated_fields = {"slug": ("name",)} is an attribute of UserProfileAdmin, which is applied to User.

prepopulated_fields triggers some javascript that autogenerates the value of a SlugField out of the values of some other fields of the same model. What you are trying is to prepopulate a field of a different model. The UserProfileAdmin is applied to User, the prepopulated_fields refers to the field slug which is unknown to the model User. It is defined in UserProfile.

That's why I think that the biggest problem here is the name UserProfileAdmin which should rather be UserAdmin. Don't confuse the model to which the prepopulated_fields is applied with the one that is inlined. Even when there is a OneToOne relation, it still is a different model.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜