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?
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.
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?
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
À 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)
from django.contrib import admin
from .models import Projects, ProjectsUsers, Comments, ProjectsDescription
Models = (Projects, ProjectsUsers, Comments, ProjectsDescription)
admin.site.register(Models)