【问题标题】:Display field from another model in ModelAdmin of User model在用户模型的 ModelAdmin 中显示来自另一个模型的字段
【发布时间】:2022-10-05 17:09:22
【问题描述】:

我的 Django 项目基于内置的User 模型。

对于一些额外的属性,我定义了另一个模型:

模型.py:

class Status(models.Model):
    email = models.ForeignKey(User, on_delete=models.CASCADE)

    is_verified = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.email

这是自定义 ModelAdmin:

管理员.py:

class CustomUserAdmin(UserAdmin):
    model = User
    list_display = [\'email\']
    search_fields = [\'email\']

我希望list_display 向我展示来自Status 模型的is_verified 和is_active 字段,但我迷路了。

我已经研究了一些类似的问题,例如Display field from another model in django admin 或Add field from another model Django,但没有一个解决方案适用,因为我的模型之一是 Django 的内置模型。

    标签: django


    【解决方案1】:

    尝试这个。

    模型.py

    class Status(models.Model):
        # email = models.ForeignKey(User, on_delete=models.CASCADE)
        email = models.OneToOneField(
            User,
            on_delete=models.CASCADE,
            related_name='status'
        )
    
        is_verified = models.BooleanField(default=False)
        is_active = models.BooleanField(default=False)
    
        def __str__(self):
            return self.email
    

    管理员.py

    class CustomUserAdmin(UserAdmin):
        model = User
        list_display = ['email', 'is_verified', 'is_active']
        search_fields = ['email']
        
        def is_verified(self, obj):
            return obj.status.is_verified
        
        def is_active(self, obj):
            return obj.status.is_active
    

    如果您想应用显示的名称或排序,请参考以下内容 source


    我看到了你的 cmets 并尝试自己运行代码。有一些问题,所以我修改了 admin.py 如下。

    from django.contrib import admin
    from django.contrib.auth.models import User
    from django.contrib.auth.admin import UserAdmin
    
    admin.site.unregister(User)
    
    
    @admin.register(User)
    class CustomUserAdmin(UserAdmin):
        list_display = ['email', 'status_is_verified', 'status_is_active']
        list_filter = ['status__is_verified', 'status__is_active']
        search_fields = ['email']
        
        @admin.display(ordering='status__is_verified')
        def status_is_verified(self, obj):
            return obj.status.is_verified
        
        @admin.display(ordering='status__is_active')
        def status_is_active(self, obj):
            return obj.status.is_active
    

    【讨论】:

    • 一个问题:为什么我可以在list_display 中使用is_verified 而不能在list_filter 中使用?
    • 为什么在管理站点is_verified 显示True/False 而不是STAFF STATUS 和SUPERUSER STATUS 显示的绿色/白色刻度?
    • 我知道如何使用list_display 和list_filter 的区别,但我不知道为什么会这样。
    • 请阅读以下文章,了解要显示为绿色图标的 bool 类型。 stackoverflow.com/questions/8227023/…
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多