У меня есть целая куча моделей из 3 разных типов (у меня есть 3 абстрактных базовых модели, скажем, «Хлеб, яйца и пиво») и множество моделей, которые наследуют один из этих трех).динамически создавать классы Django ModelAdmin
Я хотел бы зарегистрировать конкретные модели с администратором по-разному на основе их абстрактного базового класса, без необходимости писать отдельный класс ModelAdmin для каждого из них (т.е. я хочу написать только 3 класса ModelAdmin - по одному для каждой абстрактной базы класс). Каждый тип конкретной модели имеет набор полей, которые я хочу отображать (они различны на разных конкретных моделях, но четко определенным образом, и я могу легко получить список полей, которые я хочу показать на модели Egg). Пример:
#abstract base class for Egg
class Egg(models.Model):
fields = ...
def get_only_concrete_fields(self):
'Return all fields defined on a child of Egg that are not defined on Egg'
return concrete_fields
class Meta:
abstract = True
#concrete class
class WhiteEgg(Egg):
morefields = ...
#concrete class
class BrownEgg(Egg):
otherfields = ...
Так что я хочу сделать, это зарегистрировать как WhiteEgg и BrownEgg в админке (без необходимости писать отдельный класс modeladmin для каждого), и я хочу, чтобы установить list_display в результате get_only_concrete_fields() , плюс несколько (не все) выделенных вручную полей из Egg. Я знаю, что это get_list_display() (см. https://stackoverflow.com/a/16115125/710394), но я не думаю, что он получает модель, поэтому я не могу назвать get_only_concrete_fields().
Я также пробовал перебирать модели, как показано ниже, определяя list_display для каждого и регистрируя каждую модель с помощью «базового» ModelAdmin, но это не работает, потому что он просто переназначает этот modeladmin на каждой итерации цикла.
for models in all_egg_models:
modeladmin = MyModelAdmin #or deepcopy(MyModelAdmin) -also doesn't work
fieldnames = ...the fields i want...
setattr(modeladmin, 'list_display', fieldnames)
admin.site.register(model, modeladmin)
Я застрял - как я могу это сделать, и СУХОЙ?
doh. да, это так. благодаря! можете ли вы переключить свой комментарий на ответ, чтобы я мог принять его и дать вам кредит? – andy