Зарегистрируйте каждую таблицу / класс из приложения на странице администратора Django - PullRequest
29 голосов
/ 25 февраля 2012

У меня есть приложение с именем doors, а у моего models.py для приложения 10 таблиц / класс. Под моим admin.py как мне зарегистрировать каждую модель в файле models.py?

Например, в настоящее время я должен жестко закодировать его:

from django.contrib import admin
from doors.models import *

admin.site.register(Group)
admin.site.register(Item)
admin.site.register(ItemType)
admin.site.register(Location)
admin.site.register(Log)
admin.site.register(Order)
admin.site.register(Property)
admin.site.register(User)
admin.site.register(Vendor)

Есть ли способ, которым я, возможно, нахожу каждый класс в models.py и перебираю и регистрирую каждый класс? Или есть какой-то подстановочный знак, который я могу использовать с Django?

Ответы [ 5 ]

31 голосов
/ 06 мая 2015

Кажется, что get_models и get_app больше не доступны в django 1.8.

Можно использовать следующее:

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

app = apps.get_app_config('dashboard')

for model_name, model in app.models.items():
    admin.site.register(model)

EXTENSION :Если вы хотите показать все или выбрать поля модели в виде сетки вместо представления столбцов в юникоде объектов модели, вы можете использовать это:

app = apps.get_app_config('your_app_name')
for model_name, model in app.models.items():
    model_admin = type(model_name + "Admin", (admin.ModelAdmin,), {})

    model_admin.list_display = model.admin_list_display if hasattr(model, 'admin_list_display') else tuple([field.name for field in model._meta.fields])
    model_admin.list_filter = model.admin_list_filter if hasattr(model, 'admin_list_filter') else model_admin.list_display
    model_admin.list_display_links = model.admin_list_display_links if hasattr(model, 'admin_list_display_links') else ()
    model_admin.list_editable = model.admin_list_editable if hasattr(model, 'admin_list_editable') else ()
    model_admin.search_fields = model.admin_search_fields if hasattr(model, 'admin_search_fields') else ()

    admin.site.register(model, model_admin)

Что это делает, он расширяет класс ModelAdminна лету и устанавливает поле list_display, которое необходимо для отображения данных модели в сеточном представлении в админке.Если вы перечислите нужные поля в вашей модели как admin_list_display, то это займет одно из них или создаст кортеж из всех полей, доступных в модели, в противном случае.

Аналогичным образом могут быть и другие необязательные поля.установить, например list_filter.

См. документацию django для получения дополнительной информации о list_display.

19 голосов
/ 25 февраля 2012

Я понял это с помощью ссылки @ arie (для django <1.8): </p>

from django.contrib import admin
from django.db.models import get_models, get_app

for model in get_models(get_app('doors')):
    admin.site.register(model)

Но мне интересно, смогу ли я сделать это без get_app ... Разве код не может быть достаточно умным, чтобы знать название своего собственного приложения?

14 голосов
/ 02 июля 2015

Начиная с Django 1.7, вы можете использовать этот код в вашем admin.py:

from django.apps import apps
from django.contrib import admin
from django.contrib.admin.sites import AlreadyRegistered

app_models = apps.get_app_config('my_app').get_models()
for model in app_models:
    try:
        admin.site.register(model)
    except AlreadyRegistered:
        pass
4 голосов
/ 27 апреля 2016

В Django 1.8, чтобы исправить сообщение об ошибке

RemovedInDjango19Warning: django.db.models.get_app is deprecated.

Мы можем использовать этот подход в 2 строки

from django.contrib import admin
from my_app.models import *
from django.apps import apps

for model in apps.get_app_config('my_app').models.values():
    admin.site.register(model)
0 голосов
/ 05 сентября 2018
from django.contrib import admin
from .models import Projects, ProjectsUsers, Comments, ProjectsDescription

Models = (Projects, ProjectsUsers, Comments, ProjectsDescription)

admin.site.register(Models)
...