如何访问由 admin.py 中的 OnetoOneField 引用的另一个模型扩展的 'User' 模型的属性

How to access attributes of the 'User' model extended by another model referenced by a OnetoOneField in admin.py

在 model.py 中,我有一个 class 扩展用户模型

class Tutor(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)

在 admin.py 中,我尝试使用 'user_id' 访问 user.id,这有效

class TutorAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'contact_number')

但是,当我尝试访问 'user' 的其他属性时,例如用户名、这种格式的电子邮件

class TutorAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'user_username', 'contact_number')

出现这种情况

访问 user.username 或 user.email 等属性的格式是什么?

更新

解决了
class TutorAdmin(admin.ModelAdmin):
    @admin.display(description='username')
    def username(self):
        u = self.user
        if u is not None:
            return u.username

    @admin.display(description='email')
    def email(self):
        u = self.user
        if u is not None:
            return u.email


    list_display = ('user_id', username, email, 'contact_number')

感谢

的解决方案

您可以定义方法并在 list_display:

中引用这些方法
class TutorAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'contact_number', <b>username</b>)

    @admin.display(description='username')
    def <b>username</b>(self, obj):
        u = obj.user
        if u is not None:
            return u.username

但是您不能编辑用户名,因为该函数定义了如何访问数据,而不是如何更改数据。

由于 __str__ 用于内置 User 模型 returns 用户名,您还可以使用:

class TutorAdmin(admin.ModelAdmin):
    list_display = ('user_id', 'contact_number', <b>user</b>)