У меня есть абстрактная модель, которая содержит тип поля, для которого я хотел бы переопределить виджет в представлении администратора.

Теперь вы не можете зарегистрировать абстрактные модели в представлении администратора, поэтому мне пришлось переопределить виджет для каждой из моделей, которые наследуются от абстрактной модели. Это кажется неуклюжим - есть ли более аккуратный способ сделать это?

models.py


class MyAbstractModel(Model):
    field_with_widget_i_want_to_override = MyFieldType()    

    class Meta:
        abstract = True

class ModelA(MyAbstractModel):
    extra_field = AnotherFieldType()

class ModelB(MyAbstractModel):
    different_extra_field = ADifferentFieldType()

admin.py

class ModelAAdmin(ModelAdmin):
    formfield_overrides = {
        MyFieldType: {'widget': MyWidget},
    }

class ModelBAdmin(ModelAdmin):
    formfield_overrides = {
        MyFieldType: {'widget': MyWidget},
    }

admin.site.register(ModelA, ModelAAdmin)
admin.site.register(ModelB, ModelBAdmin)

Теперь мой реальный проект немного сложнее, поэтому я не хочу комбинировать ModelAdmins при регистрации моделей. Есть также много других Моделей, которые наследуются от абстрактной базовой модели, поэтому я чувствую, что повторяюсь много раз.

В качестве альтернативы есть ли способ глобально переопределить виджет, используемый в администраторе для типа поля (для всех моделей)?

0
Ben 26 Ноя 2019 в 14:57

1 ответ

Абстрактные модели не могут быть зарегистрированы как ModelAdmin, поскольку они абстрактны, и django не может рассматривать их как модели данных, поэтому большинство функций администратора не могут быть применены к этим классам, поэтому вам нужно переопределить его пустым классом, по крайней мере, как в документации здесь Абстрактные классы Невозможно присвоить данные абстрактным моделям

0
A.Raouf 26 Ноя 2019 в 15:03