django admin 不显示抽象基类字段
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)
...这有点让人恼火,我必须这样做,但是嘛,也没那么糟糕...
问题出现的原因是在Django的admin界面中,抽象基类的字段没有显示出来。
解决这个问题的方法是在model admin中使用"readonly_fields"来显示非可编辑字段。
具体的解决方法如下:
首先,在model admin中创建一个继承自"admin.ModelAdmin"的类。
然后,在这个类中使用"readonly_fields"参数来指定非可编辑字段,比如"uuid"。
最后,在admin界面中,这些非可编辑字段将会显示出来。
下面是具体的代码示例:
class BaseModelMixinAdmin(admin.ModelAdmin): readonly_fields = ('uuid',)
这样,在admin界面中,"uuid"字段将会被显示为非可编辑的字段。
问题出现的原因是在使用抽象基类(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下进行测试。