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', ]