Enregistrez chaque table / classe à partir d'une application dans la page D'administration de Django

J'ai une application nommée doors et mon models.py pour l'application a 10 tables / classe. Sous Mon admin.py, Comment enregistrer chaque modèle dans le fichier models.py?

Par exemple, actuellement je dois le coder en dur:

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)

Y a-t-il un moyen de trouver chaque classe dans models.py et de parcourir et d'enregistrer chaque classe? Ou y a-t-il une sorte de Joker que je peux utiliser avec Django?

26
demandé sur hobbes3 2012-02-25 16:11:45

5 réponses

Semble que get_models et get_app ne sont plus disponibles dans django 1.8.

Ce qui suit peut être utilisé:

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: Si vous souhaitez afficher tout ou sélectionner les champs du modèle de grille au lieu d'une seule colonne unicode représentation du modèle d'objets que vous pouvez utiliser ceci:

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)

Ce que cela fait, c'est qu'il étend la classe ModelAdmin à la volée et définit le Champ list_display requis pour afficher les données du modèle dans la représentation de la grille dans le admin. Si vous listez les champs souhaités dans votre modèle comme admin_list_display, Il prend celui-ci, ou génère un tuple de tous les champs disponibles dans le modèle, sinon.

D'autres champs optionnels peuvent également être définis, tels que list_filter.

Voir documentation django pour plus d'informations sur list_display.

27
répondu mehmet 2016-09-20 13:13:33

Je l'ai compris avec le lien de @ arie (pour django

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)

, Mais je me demande si je peux le faire sans get_app... Le code ne pourrait-il pas être assez intelligent pour connaître le nom de sa propre application?

18
répondu hobbes3 2018-01-01 12:29:43

Depuis Django 1.7, vous pouvez utiliser ce code dans votre 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
13
répondu Sjoerd 2015-07-02 12:10:45

À partir de Django 1.8, pour corriger le message d'erreur

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

, Nous pouvons utiliser cette approche en 2 lignes

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)
4
répondu Samuel Chan 2016-04-27 01:41:12
from django.contrib import admin
from .models import Projects, ProjectsUsers, Comments, ProjectsDescription

Models = (Projects, ProjectsUsers, Comments, ProjectsDescription)

admin.site.register(Models)
0
répondu Igit Manukyan 2018-09-05 12:06:33