tutorial tipos relaciones libro español develop datos django django-admin

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)