Comment remplacer et étendre la base de Django admin modèles?
Comment remplacer un modèle d'administrateur (par ex. admin/index.html) alors que dans le même temps, l'extension (voir https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template)?
Premier - je sais que cette question a été posée et répondue avant (voir Django: le remplacement ET l'extension d'un modèle d'application), mais comme la réponse dit que ce n'est pas directement applicable si vous êtes à l'aide de la app_directories modèle de chargeur (qui est la plupart du temps).
Ma solution actuelle est de faire des copies et de les étendre au lieu de l'extension directement depuis l'admin de modèles. Cela fonctionne très bien mais c'est vraiment déroutant et ajoute un surcroît de travail quand l'admin modèles de changement.
Il pourrait penser à une coutume de prolongation de balise pour les modèles mais je ne veux pas réinventer la roue si il existe déjà une solution.
Sur une note de côté: Est-ce que quelqu'un sait si ce problème sera abordé par Django lui-même?
- Copier les modèles d'administrateur, en les étendant et en remplaçant/ajout d'un bloc est le plus efficace, bien que non optimale des flux de travail compte tenu de l'état actuel de Django. Je n'ai pas vu d'autre moyen de faire ce que vous essayez de le faire en trois ans de travail avec elle 🙂
- Bien je ne sais pas si c'est une bonne chose ou pas, mais au moins les gens comme vous sont venus à la même conclusion. C'est bon à entendre. 🙂
Vous devez vous connecter pour publier un commentaire.
Mise à jour:
Lisez la documentation de votre version de Django. par exemple,
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates
https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding-templates
Réponse originale à cette question à partir de 2011:
J'ai eu le même problème à propos d'un an et demi et j'ai trouvé un joli modèle de chargeur sur djangosnippets.org qui rend ce facile. Il vous permet d'étendre un modèle dans une application spécifique, vous donnant la possibilité de créer votre propre admin/index.html qui s'étend de la admin/index.html modèle de l'administrateur de l'application. Comme ceci:
Je vous ai donné un exemple complet sur la façon d'utiliser ce modèle de chargeur dans un post de blog sur mon site.
django-apptemplates
si il peut cesser de fonctionner un jour.Comme pour Django 1.8 être la version actuelle, il n'y a pas besoin de lien copiez le admin/templates dossier de votre projet, ou installer des middlewares comme suggéré par les réponses ci-dessus. Voici quoi faire:
créer l'arbre suivant la structure(recommandé par le la documentation officielle)
Note: L'emplacement de ce fichier n'est pas important. Vous pouvez mettre à l'intérieur de votre application et il faudra encore travailler. Tant que son emplacement peut être découvert par django. Ce qui est plus important, c'est le nom d'un fichier HTML doit être le même que l'original de nom de fichier HTML fourni par django.
Ajouter ce modèle de chemin d'accès à votre settings.py:
Identifier le nom et le bloc que vous souhaitez remplacer. Ceci est fait par la recherche dans django admin/répertoire des modèles. Je suis à l'aide de virtualenv, donc pour moi, le chemin est ici:
Dans cet exemple, je veux modifier la page ajouter un formulaire utilisateur. Le modèle responsiblve de ce point de vue est change_form.html. Ouvrir le change_form.html et de trouver le {% block %} que vous souhaitez étendre.
Dans votre change_form.html, écrire des choses comme ceci:
De chargement de votre page et vous devriez voir les changements
../
à "exetends" chemin d'accès et de spécifier le chemin d'origine plus unique{% extends "../../admin/templates/admin/index.html" %}
. lien vers la réponsesi vous avez besoin de remplacer le
admin/index.html
, vous pouvez définir la index_template paramètre de laAdminSite
.par exemple
et le lieu de votre modèle dans
<appname>/templates/admin/my_custom_index.html
{% extends "admin/index.html" %}
de my_custom_index.html et pour que la référence à la django admin modèle sans le copier. Je vous remercie.Avec
django
1.5 (au moins), vous pouvez définir le modèle que vous souhaitez utiliser pour un particuliermodeladmin
voir https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options
Vous pouvez faire quelque chose comme
Avec
change_form.html
d'être un simple modèle html étendreadmin/change_form.html
(ou pas si vous voulez le faire à partir de zéro)Chengs réponse est bonne, howewer selon les documents admin pas chaque modèle d'administrateur peut être écrasée de cette façon:
https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates
J'ai dû remplacer le login.html de l'administration et, par conséquent, devait mettre le écrasées modèle dans cette structure de dossier:
(sans le myapp sous-dossier dans l'admin)
Je n'ai pas assez repution pour commenter Cheng du post c'est pourquoi j'ai dû écrire cela comme une nouvelle réponse.
La meilleure façon de le faire est de mettre le Django admin modèles à l'intérieur de votre projet. Si vos modèles serait en
templates/admin
tandis que le stock de Django admin modèles serait de diretemplate/django_admin
. Ensuite, vous pouvez faire quelque chose comme ce qui suit:templates/admin/change_form.html
Si vous êtes inquiet au sujet de garder le stock des modèles jusqu'à date, vous pouvez les inclure avec svn externes ou similaire.
--ignore
argument avecmakemessages
. Voir: docs.djangoproject.com/en/dev/ref/django-admin/#makemessagesJe ne pouvais pas trouver une seule réponse ou une section officielle de Django docs qui avait tous les informations dont j'avais besoin pour remplacer/prolonger l'admin par défaut des modèles, donc j'écris cette réponse comme un guide complet, en espérant qu'il serait utile pour les autres dans le futur.
En supposant que la norme de Django structure de projet:
Voici ce que vous devez faire:
Dans
mysite/admin.py
, créez une sous-classe deAdminSite
:Assurez-vous d'importer
custom_admin_site
dans leadmin.py
de vos applications et d'enregistrer vos modèles pour les afficher sur votre personnalisé admin du site (si vous voulez).Dans
mysite/apps.py
, créez une sous-classe deAdminConfig
et définirdefault_site
àadmin.CustomAdminSite
de l'étape précédente:Dans
mysite/settings.py
, remplacerdjango.admin.site
dansINSTALLED_APPS
avecapps.CustomAdminConfig
(personnalisé de votre admin app config à partir de l'étape précédente).Dans
mysite/urls.py
, remplaceradmin.site.urls
de l'administrateur de l'URL decustom_admin_site.urls
Créer le modèle que vous souhaitez modifier dans votre
templates
répertoire, le maintien de la valeur par défaut de Django admin modèles de structure de répertoire spécifié dans le docs. Par exemple, si vous avez été la modification deadmin/index.html
, créez le fichiertemplates/admin/index.html
.Tous les modèles existants peuvent être modifiés de cette façon, et leurs noms et les structures peuvent être trouvés dans Django du code source.
Maintenant, vous pouvez soit remplacer le modèle par écrit à partir de zéro ou de l'agrandir, puis remplacer/extension des blocs spécifiques.
Par exemple, si vous vouliez garder tout aussi-est, mais qui voulaient remplacer les
content
bloc (qui sur la page d'index répertorie les applications et leurs modèles que vous avez enregistrée), ajoutez les lignes suivantes àtemplates/admin/index.html
:De préserver le contenu original d'un bloc, ajouter
{{ block.super }}
où vous le souhaitez le contenu d'origine à afficher:Vous pouvez également ajouter des styles et des scripts en modifiant la
extrastyle
etextrahead
blocs.Je suis d'accord avec Chris Pratt. Mais je pense qu'il est préférable de créer le lien symbolique à l'origine de Django dossier où les modèles d'administration lieu:
et comme vous pouvez le voir, il dépend de la version de python et le dossier où le Django installé. Donc, à l'avenir, ou sur un serveur de production, vous devez modifier le chemin d'accès.
Ce site avait une solution simple qui a travaillé avec mon Django 1.7 configuration.
PREMIÈRE: Faire un lien symbolique nommé admin_src dans votre projet de modèle/répertoire de votre installation de Django modèles. Pour moi sur Dreamhost à l'aide d'un virtualenv, ma "source" Django admin modèles sont:
DEUXIÈME: Créer un admin - répertoire dans le répertoire templates/
Donc, mon projet de modèle/répertoire ressemblait maintenant à ceci:
TROISIÈME: Dans votre nouveau modèle/admin/répertoire créer un base.html un fichier avec le contenu:
QUATRIÈME: Ajouter votre admin favicon-admin.ico dans votre racine statique dossier img.
Fait. Facile.
Vous pouvez utiliser django-overextends, qui prévoit la circulaire de l'héritage de template de Django.
Il s'agit de la Mezzanine de la CMS, d'où Stephen extrait en autonome Django extension.
Plus d'infos que vous trouverez dans "Substitution vs l'Extension des Modèles" (http:/mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) à l'intérieur de la Mezzanine docs.
Pour les plus profondes entrailles de regarder Stephens Blog "Circulaire de l'Héritage de Template de Django" (http:/blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).
Et dans Google Groupes de discussion (https:/groups.google.com/forum/#!topic/mezzanine-utilisateurs/sUydcf_IZkQ), qui a commencé le développement de cette fonctionnalité.
Remarque:
Je n'ai pas la réputation d'ajouter plus de 2 liens. Mais je pense que les liens fournir d'intéressantes informations d'arrière-plan. Donc j'ai juste à gauche une barre oblique après "le protocole http(s):". Peut-être quelqu'un avec une meilleure réputation peut réparer les liens et supprimer cette note.
pour l'application de l'indice ajoutez cette ligne à quelque part commune de py fichier comme url.py
pour l'application du module index : ajoutez cette ligne à admin.py
pour changer de liste : ajoutez cette ligne à l'admin catégorie:
pour l'application du module de modèle de formulaire : ajoutez cette ligne à votre administrateur de classe
etc. et trouver d'autres dans le même admin du module classes