django admin 不显示抽象基类字段

10 浏览
0 Comments

django admin 不显示抽象基类字段

我有以下代码:

class BaseModelMixin(models.Model):
    class Meta:
        abstract = True
    uuid = models.UUIDField(default=uuid4, editable=False, db_index=True)
    created_on = models.DateTimeField(default=now, editable=False, blank=True)
    updated_on = models.DateTimeField(default=now, editable=False, blank=True)

class Something(BaseModelMixin):
    whatever = models.TextField(blank=True, null=True)
class SomethingElse(BaseModelMixin):
    whoever = models.TextField(blank=True, null=True)

在管理网站上,对于每个"Something",我只看到"whatever",但看不到"uuid","created_on"或"updated_on"。我一定是漏掉了一些明显的东西...如果Django管理未自动显示这些字段,那将是令人惊讶的。

我确实想要抽象类;我不想要一个额外的表,我希望"uuid","created_on"和"updated_on"字段出现在具体类表中,它们确实出现了,只是在Django管理网站中没有显示出来。

我做错了什么?

Anoop的答案部分正确:

class BaseModelMixinAdmin(admin.ModelAdmin):
    readonly_fields=('uuid','created_on','updated_on')

但还需要:

admin.site.register(Something, BaseModelMixinAdmin)
admin.site.register(SomethingElse, BaseModelMixinAdmin)

...这有点让人恼火,我必须这样做,但是嘛,也没那么糟糕...

0
0 Comments

问题出现的原因是在Django的admin界面中,抽象基类的字段没有显示出来。

解决这个问题的方法是在model admin中使用"readonly_fields"来显示非可编辑字段。

具体的解决方法如下:

首先,在model admin中创建一个继承自"admin.ModelAdmin"的类。

然后,在这个类中使用"readonly_fields"参数来指定非可编辑字段,比如"uuid"。

最后,在admin界面中,这些非可编辑字段将会显示出来。

下面是具体的代码示例:

class BaseModelMixinAdmin(admin.ModelAdmin):
    readonly_fields = ('uuid',)

这样,在admin界面中,"uuid"字段将会被显示为非可编辑的字段。

0
0 Comments

问题出现的原因是在使用抽象基类(abstract base class)时,Django管理界面(admin)无法显示抽象基类的字段。解决方法是创建一个混合类(mixin),将抽象基类的字段添加到混合类的只读字段(readonly_fields)中,并在每个具体模型的管理类中继承该混合类。

具体实现如下:

# admin.py
# ===================================================================
from django.contrib import admin
from .models import *
# 创建一个混合类用于存储公共逻辑
class BaseModelMixinAdmin(admin.ModelAdmin):
    readonly_fields = (
        'uuid',
        'created_on',
        'updated_on',
    )
# 在每个具体模型的管理类中继承该混合类
class SomethingAdmin(BaseModelMixinAdmin, admin.ModelAdmin):
    pass
class SomethingElseAdmin(BaseModelMixinAdmin, admin.ModelAdmin):
    pass
admin.site.register(Something, SomethingAdmin)
admin.site.register(SomethingElse, SomethingElseAdmin)

通过这种方式,我们可以在每个具体模型的管理类中进行个别的修改,而公共逻辑则从BaseModelMixinAdmin中继承。

该方法已在Python 3.8.10和Django 4.0下进行测试。

0