从admin.py中的配置文件访问用户数据



我正在尝试为我的新Profile.类创建一个管理配置。

class Profil(models.Model):
    user = models.OneToOneField(User) 
    birthdate = models.DateField("date de naissance", blank=True, null=True)
    country = models.CharField("pays", max_length=64, blank=True)

这是这个类的管理员:

class ProfilAdmin(admin.ModelAdmin):
    list_display = ('user.username', 'user.email', 'country', 'user.is_staff')
    list_filter = ('user.date_joined', 'user.is_staff')
    search_fields = ('user.username', 'user.email', 'country', 'user.first_name')
admin.site.register(Profil, ProfilAdmin)

当然,'user.username'不起作用。如何通过我的Profile类获取用户的用户名?

这就是解决方案,看起来不错:

class ProfilAdmin(admin.ModelAdmin):
    list_display = ('get_username', 'get_email', 'country')
    list_filter = ('get_date_joined', 'get_is_staff')
    search_fields = ('user__username', 'user__date_joined', 'user__is_staff')
    def get_username(self, obj):
        return obj.user.username
    get_username.short_description = 'User'
    get_username.admin_order_field = 'user__username'
    def get_email(self, obj):
        return obj.user.email
    get_email.short_description = 'Email'
    get_email.admin_order_field = 'user__email'
    def get_date_joined(self, obj):
        return obj.user.date_joined
    get_date_joined.short_description = 'Date joined'
    get_date_joined.admin_order_field = 'user__date_joined'
    def get_is_staff(self, obj):
        return obj.user.is_staff
    get_is_staff.short_description = 'Is staff'
    get_is_staff.admin_order_field = 'user__is_staff'

但现在我在makemigrations过程中遇到了以下错误:

SystemCheckError: System check identified some issues:
ERRORS:
<class 'accounts.admin.ProfilAdmin'>: (admin.E116) The value of 'list_filter[0]' refers to 'get_date_joined', which does not refer to a Field.
<class 'accounts.admin.ProfilAdmin'>: (admin.E116) The value of 'list_filter[1]' refers to 'get_is_staff', which does not refer to a Field.

我知道is_staff是一个类方法,但我如何访问它?

您无法直接访问对象。相反,您将不得不使用自定义方法。以下内容应该让您开始:

class ProfilAdmin(admin.ModelAdmin):
    list_display = ('get_username', )
    search_fields = ['user__username', ]
    def get_username(self, obj):
        return obj.user.username
    get_patient.short_description = 'User'
    get_patient.admin_order_field = 'user__username'

另请参阅Django admin list_display属性用法。

最新更新