2013-09-21 2 views
1

У меня есть целая куча моделей из 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) 

Я застрял - как я могу это сделать, и СУХОЙ?

+0

doh. да, это так. благодаря! можете ли вы переключить свой комментарий на ответ, чтобы я мог принять его и дать вам кредит? – andy

ответ

0

Ваша идея переопределить метод get_list_display звучит хорошо.

В способе вы можете получить доступ к модели с помощью self.model.

+0

self.model была частью, которая мне нужна. благодаря! – andy

Смежные вопросы