在所有管理页面中将模型字段设为只读

时间:2019-09-12 06:54:06

标签: python django django-models

我的项目有多个模型和模型的自定义管理页面。所有模型都继承自“ BaseModel”。对于业务功能,我们必须更新“基本模型”以包括2个新字段。鉴于所有模型都继承了这2个新字段,它们现在在管理页面中显示为可编辑字段。根据业务功能,这两个字段应显示为只读字段

为了使字段为只读,我们通常在admin类中使用readonly_fields = [read ..]。有没有一种方法可以实现而无需接触所有管理员类?

1 个答案:

答案 0 :(得分:2)

创建一个基本的管理模型类,并在每个管理模型类上使用它。 AFAIK,这将是您可以拥有的最佳解决方案

from django.contrib import admin


class BaseModelAdmin:
    """
    The base model admin class
    """
    readonly_fields = ["field_1", "field_2"]


class FooModelAdmin(BaseModelAdmin, admin.ModelAdmin):
    """
    Inheriting the 'BaseModelAdmin' class here
    """
    ...


class BarModelAdmin(BaseModelAdmin, admin.ModelAdmin):
    """
       Inheriting the 'BaseModelAdmin' class here
    """

    def get_readonly_fields(self, request, obj=None):
        """
        If you have "readonly_fields" that are specific to certain Model, override this method
        """
        readonly_fields = super().get_readonly_fields(request, obj=None) + ["bar_field_1", "bar_field_2"]
        return readonly_fields


admin.site.register(FooModel, FooModelAdmin)  # registering the model in Django admin
admin.site.register(BarModel, BarModelAdmin)  # registering the model in Django admin