tipos - relaciones django
¿Cómo registrar múltiples modelos con el administrador? (4)
Si quiero registrar mis modelos con el administrador tengo que hacer esto así:
#admin.py
admin.site.register(models.About)
Pero con varios modelos no puedes hacer algo como esto:
models = (models.Project, models.Client, models.About)
for m in models:
admin.site.register(m)
En primer lugar: ¿por qué no? En segundo lugar: imagine que uno tiene muchos modelos a los que se debería poder acceder desde la interfaz de administración. ¿Cómo se hace eso de una manera genérica?
Basado en el fragmento here , lo que normalmente hago es tener el siguiente código en mi admin.py
from django.db.models import get_models, get_app
from django.contrib import admin
from django.contrib.admin.sites import AlreadyRegistered
def autoregister(*app_list):
for app_name in app_list:
app_models = get_app(app_name)
for model in get_models(app_models):
try:
admin.site.register(model)
except AlreadyRegistered:
pass
autoregister(''myapp'')
Con respecto al lanzamiento reciente de Django 1.7, puede usar el decorador django.contrib.admin.register
para registrar varios modelos que usan la misma clase de administrador.
from django.contrib import admin
from .models import Project, Client, About
@admin.register(Project, Client, About)
class DefaultAdmin(admin.ModelAdmin):
pass
Actualizar
Considere hacer una llamada simple en lugar de declarar una clase ficticia
admin.site.register
tiene esta definición en la biblioteca:
def register(self, model_or_iterable, admin_class=None, **options):
por lo tanto, los modelos que se registrarán pueden ser un solo modelo o un objeto iterable, así que simplemente use esto:
myModels = [models.Project, models.Client, models.About] # iterable list
admin.site.register(myModels)
He probado esto en mi sitio y funciona perfectamente bien.
# File: admin.py
from django.contrib import admin
from .models import Project, Client, About
admin.register(Project, Client, About)(admin.ModelAdmin)