Как я могу автоматически создавать list_filters для всех моих моделей на странице администратора django?

У меня есть сайт Django, использующий администратора для управления моделями. В настоящее время я использую

from django.db.models.base import ModelBase

for name, var in databuild_models.__dict__.items():
    if type(var) is ModelBase:
        admin.site.register(var)

Чтобы зарегистрировать все модели в модуле с модулем администратора. Однако я хочу автоматически добавлять list_filters для каждого атрибута каждой модели. Я прочитал https://docs.djangoproject.com/en/1.8/ref/contrib/admin/, где они используют форму:

class MymodelAdmin(admin.ModelAdmin):
    list_filter = ['model_name_attribute']

а потом

admin.site.register(models.MyModel, MyModelAdmin)

Есть ли способ аналогичным образом перебрать каждый атрибут в модели и добавить его в список фильтров?

Например:

filter_list_fields = []
for attr in MyModel:
    filter_list_fields.append(str(attr))
list_filter = filter_list_fields

а затем зарегистрировать их как общий класс?


person Tui Popenoe    schedule 26.04.2015    source источник


Ответы (1)


Во-первых, для получения список моделей в вашем приложении, а не проверять __dict__ модуля

В Django 1.8+ вы можете получить список имен полей для модели, используя Model._meta.get_fields. Я исключил автоматически сгенерированное поле id, и вы, возможно, захотите внести дополнительные улучшения.

В python вы можете создать класс динамически, используя type. . Вам нужно имя нового класса (здесь это не важно), базовые классы, от которых он наследуется (в данном случае Admin.ModelAdmin, и словарь атрибутов (в данном случае есть только один атрибут, list_filter).

Наконец, зарегистрируйте модель в пользовательском администраторе модели, который мы создали.

Собрав все вместе, ваш admin.py должен выглядеть примерно так:

from django.contrib import admin
from django.apps import apps

app_config  = apps.get_app_config('myapp')
models = app_config.get_models()

for Model in models:
    fieldnames = [f.name for f in Model._meta.get_fields() if f.name != 'id']
    ModelAdmin = type('ModelAdmin', (admin.ModelAdmin,), {'list_filter': fieldnames})
    admin.site.register(Model, ModelAdmin)
person Alasdair    schedule 26.04.2015