Django как сделать базовую модель администратора общий

Здесь я создал модель baseadmin для использования во всех моих моделях администраторов:

class BaseAdmin(admin.ModelAdmin):
    base_readonly_fields = ('created', 'updated','removed')

    def get_readonly_fields(self, request, obj=None):
        if self.readonly_fields:
            return tuple(self.readonly_fields) + self.base_readonly_fields

        else:
            return self.base_readonly_fields


@admin.register(models.Example)
class Example(BaseAdmin):
    list_display = ['id', 'name', 'sf_id', ]

Проблема с BaseAdmin в том, что иногда некоторые модели не имеют 'removed' или 'updated'. Вот почему я получаю ошибку.

Так что я хочу сделать baseadmin общим, если поле выходит, это сделает его доступным для чтения, как это есть в baseadmin, в противном случае и если нет такого поля, это просто пройдет и не вызовет никакой ошибки. Есть идеи как это проверить и сделать базовый администратор более гибким?

Один из способов сделать это - переопределить base_readonly_fields в классе Example и удалить их из base_readonly_fields.

Итак, некоторые классы администраторов, которые вы определяете и которые не имеют этих полей, должны переопределить base_readonly_fields.

Это стоит делать только в том случае, если у вас больше классов администраторов, в которых есть эти поля read_only_fields, чем классов, в которых этих полей нет.

Если больше классов администраторов не имеют полей read_only, то вы должны удалить их из базы и добавить их тем же способом, переопределив base_readonly_fields и добавив их там.

Наследуйте их отдельно.

class BaseAdmin(admin.ModelAdmin):
    base_readonly_fields = ('created',)

    def get_readonly_fields(self, request, obj=None):
        if self.readonly_fields:
            return tuple(self.readonly_fields) + self.base_readonly_fields

        else:
            return self.base_readonly_fields

class BaseAdminWithUpdateRemoveField(BaseAdmin):
    base_readonly_fields = ('created', 'updated', 'removed')

@admin.register(models.ExampleUpdateRemoveField)
class ExampleWithUpdateRemoveField(BaseAdminWithUpdateRemoveField):
    list_display = ['id', 'name', 'sf_id', ]

@admin.register(models.Example)
class Example(BaseAdmin):
    list_display = ['id', 'name', 'sf_id', ]
Вернуться на верх