Enregistrement automatique des modèles Django auth en utilisant le site d'administration personnalisé

J'ai implémenté la gestion d'authentification en utilisant Django auth avec le site administrateur par défaut, mais ensuite j'ai voulu utiliser mon propre site administrateur pour réécrire certains comportements:

class OptiAdmin(admin.AdminSite):
    site_title = "Optimizer site's admin"
    #...Other stuff here

puis j'ai enregistré mes propres modèles:

admin_site = OptiAdmin(name='opti_admin')
admin.site.register(MyModel, MyModelAdmin)
#Other stuff here

mais quand je vais sur le site d'administration, Je ne peux voir que les modèles que je viens d'enregistrer, ce qui me semble juste mais je voudrais voir tous les autres modèles d'applications dans ce nouveau site personnalisé, y compris les utilisateurs et les groupes de l'auteur et je ne sais pas comment faire cela automatiquement comme le fait l'administrateur par défaut, aide pls:).

16
demandé sur gerosalesc 2015-09-16 18:07:28

2 réponses

  1. créez votre propre administrateur avec un simple __init__() remplacer.
  2. Import admin urls.py.

remplacer L'administrateur Django et obtenir le autodiscover() le comportement est possible avec un effort minime. Voici une structure de projet générée dans le type django-admin startproject project mode:

project/
    manage.py
    project/
        __init__.py
        settings.py
        urls.py
        wsgi.py
        admin.py  # CREATE THIS FILE

project/admin.py: (je pense que cela fait plus de sens de faire ce à le projet niveau.)

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()

project/urls.py (extrait):

from . import admin  # PART 3

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

Partie 1 est simple Python. Par l'importation de tout, de l' django.contrib.admin dans votre espace de noms, il agit comme un simple remplacement. Je suppose que vous n'avez pas à le faire, mais ça aide à préserver les attentes. Partie 3, Connectez simplement votre administrateur. La partie 2 est le vrai truc. Comme le documentation dit autodiscover() est appelé pour faire le travail. Tous de découverte automatique n'est passer par INSTALLED_APPS tentez d'importer un fichier appelé admin.py. Importer exécute le code Bien sûr et ce code fait la même chose que vous faites pour enregistrer des modèles (exemple par décorateur et par exemple méthode). Pas de magie. Vous ne pas vous devez enregistrer vos modèles auprès de votre administrateur personnalisé (comme le dit la documentation).

découverte automatique semble plus intelligent qu'il ne l'est avec ses register_tokwarg. Cela indique que vous pouvez appeler autodiscover() - vous passer votre propre administrateur. Non; il n'y a pas de câblage connecté (futur?). La cession se produit ici et est fixé à l'instance de L'administrateur natif ici (ou ici en utilisant le décorateur). Les modèles Django contrib s'enregistrent à cette instance, tout comme les bibliothèques tierces. Ce n'est pas quelque chose que vous pouvez brancher dans.

Voici le truc, cependant, _registry est juste un dictionnaire cartographique. Laissons Django autodiscerner tous les les choses et puis juste copier la cartographie. C'est pourquoi self._registry.update(site._registry) fonctionne. "self "est votre instance administrative personnalisée," site " est L'instance de Django et vous pouvez enregistrer vos modèles avec l'un ou l'autre.

(note finale: si les modèles sont manquants, c'est à cause de l'ordre d'importation. Toutes les inscriptions au site administratif de Django doivent se faire avant que vous ne copiez _registry. S'inscrire directement à votre administrateur personnalisé est probablement la chose la plus facile.)

12
répondu JCotton 2016-01-25 21:59:32

Les Docs de Django suggèrent d'utiliser SimpleAdminConfig avec un site d'administration personnalisé.

INSTALLED_APPS = (
    ...
    'django.contrib.admin.apps.SimpleAdminConfig',
    ...
)

Qui empêche les modèles enregistrés avec la valeur par défaut AdminSite.

les docs semblent supposer que vous allez importer les modèles individuellement et les ajouter à votre site d'administration personnalisé:

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)

Ce serait très répétitif si vous avez des modèles dans de nombreuses applications. Il n'offre aucun conseil sur la façon d'enregistrer automatiquement des modèles à partir de toutes vos applications avec votre site personnalisé.

Vous pouvez essayer de monkey patching admin, et en remplaçant admin.site avec les vôtres.

from django.contrib import admin
admin.site = OptiAdmin(name='opti_admin')

puis, quand le code est appelé admin.site.register(), il enregistrerait le modèle avec votre site d'administration. Ce code devrait être activé avant l'enregistrement des modèles. Vous pouvez essayer de le mettre dans le AppConfig pour votre application, et assurez-vous que votre application est au-dessus de django.contrib.admin.

9
répondu Alasdair 2015-09-16 18:21:30