tutorial - django what is it
Registrar automáticamente modelos Django auth usando un sitio de administración personalizado (3)
- Cree su propio AdminSite con una simple
__init__()
. - Importe su administrador en
urls.py
Reemplazar el administrador de Django y obtener el comportamiento de autodiscover()
es posible con un mínimo esfuerzo. Aquí hay una estructura de proyecto generada en la forma típica del proyecto django-admin startproject project
:
project/
manage.py
project/
__init__.py
settings.py
urls.py
wsgi.py
admin.py # CREATE THIS FILE
project / admin.py: (Creo que tiene más sentido hacer esto a nivel de proyecto).
from django.contrib.admin import * # PART 1
class MyAdminSite(AdminSite):
site_header = "My Site"
def __init__(self, *args, **kwargs):
super(MyAdminSite, self).__init__(*args, **kwargs)
self._registry.update(site._registry) # PART 2
site = MyAdminSite()
proyecto / urls.py (fragmento):
from . import admin # PART 3
urlpatterns = [
url(r''^admin/'', admin.site.urls),
]
Parte 1 es simple Python. Al importar todo desde django.contrib.admin
a su espacio de nombres, actúa como un reemplazo django.contrib.admin
. Supongo que no tiene que hacer esto, pero ayuda a preservar las expectativas. Parte 3, simplemente conecte su administrador. La parte 2 es el verdadero truco. Como dice la documentation , autodiscover()
se llama para hacer el trabajo. Todo lo que se hace automáticamente es pasar por INSTALLED_APPS
intentando importar un archivo llamado admin.py
. La importación ejecuta el código, por supuesto, y ese código está haciendo lo mismo que usted para registrar modelos (ejemplo por decorator y ejemplo por method ). No hay magia. No tiene que registrar sus modelos con su administrador personalizado (como dice la documentación).
La detección automática parece más inteligente de lo que es con su register_to
kwarg . Eso indica que puedes llamar autodiscover () a ti mismo pasando tu propio administrador. No no hay cableado conectado allí (¿característica futura?). La asignación se realiza here y se fija en la instancia de AdminSite nativa here (o here con el decorador). Los modelos contrib de Django se registran en esa instancia y también lo harán las bibliotecas de terceros. No es algo que puedas enganchar.
Sin embargo, aquí está el truco, _registry
es solo un mapeo de diccionario. Deje que Django detecte automáticamente todas las cosas y luego simplemente copie la asignación . Es por eso que self._registry.update(site._registry)
funciona. "self" es su instancia personalizada de AdminSite, "site" es la instancia de Django y puede registrar sus modelos con cualquiera.
(Nota final: si faltan modelos, es debido al orden de importación. Todo el registro en AdminSite de Django debe realizarse antes de copiar _registry
. Registrarse directamente en su administrador personalizado es probablemente lo más fácil).
Implementé la administración de autenticación usando Django auth con el sitio de administración predeterminado, pero luego quise usar mi propio AdminSite para volver a escribir algunos comportamientos:
class OptiAdmin(admin.AdminSite):
site_title = "Optimizer site''s admin"
#...Other stuff here
Luego registré mis propios modelos:
admin_site = OptiAdmin(name=''opti_admin'')
admin.site.register(MyModel, MyModelAdmin)
#Other stuff here
Pero cuando voy al sitio de administración solo puedo ver los modelos que acabo de registrar, lo que me parece justo, pero me gustaría ver todos los demás modelos de aplicaciones en este nuevo sitio personalizado, incluidos los usuarios y grupos de autenticación y no No sé cómo hacer esto automáticamente como lo hace el administrador predeterminado, por favor ayuda :).
Agregando a la gran respuesta de JCotton:
El uso de django 2.0, el reemplazo de site_header
y site_title
en el sitio de administración personalizado solo funciona para la página de index
.
Para que funcione con todas las vistas de administrador, extienda el código de JCotton con lo siguiente:
def __init__(self, *args, **kwargs):
super(MyAdminSite, self).__init__(*args, **kwargs)
self._registry.update(site._registry) # PART 2
for model, model_admin in self._registry.items():
model_admin.admin_site = self
La documentación de Django sugiere utilizar SimpleAdminConfig
con un sitio de administración personalizado.
INSTALLED_APPS = (
...
''django.contrib.admin.apps.SimpleAdminConfig'',
...
)
Eso evita que los modelos se registren con el AdminSite
predeterminado.
Parece que los documentos suponen que importará los modelos individualmente y los agregará a su sitio de administración personalizado:
from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin
admin_site.register(Group, GroupAdmin)
admin_site.register(User, UserAdmin)
Esto sería muy repetitivo si tienes modelos en muchas aplicaciones. No ofrece consejos sobre cómo registrar automáticamente modelos de todas sus aplicaciones en su sitio personalizado.
Puedes probar el parche de admin
mono y reemplazar admin.site
con el tuyo.
from django.contrib import admin
admin.site = OptiAdmin(name=''opti_admin'')
Luego, cuando el código llamado admin.site.register()
, registraría el modelo en su sitio de administración. Este código debería ejecutarse antes de registrar cualquier modelo. Puede intentar colocarlo en AppConfig
para su aplicación y asegurarse de que esté por encima de django.contrib.admin
.