Comment remplacer un modèle d'administrateur (par exemple, admin / index.html) tout en l'étendant (voir https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing -un-modèle-d'administration )?
Premièrement - je sais que cette question a déjà été posée et répondue (voir Django: Remplacer ET étendre un modèle d'application ) mais comme la réponse l'indique, elle n'est pas directement applicable si vous utilisez le chargeur de modèle app_directories (qui est la plupart des temps).
Ma solution de contournement actuelle consiste à faire des copies et à les étendre au lieu d'étendre directement à partir des modèles d'administration. Cela fonctionne très bien mais c'est vraiment déroutant et ajoute du travail supplémentaire lorsque les modèles d'administration changent.
Il pourrait penser à une étiquette d'extension personnalisée pour les modèles, mais je ne veux pas réinventer la roue s'il existe déjà une solution.
En passant: est-ce que quelqu'un sait si ce problème sera résolu par Django lui-même?
la source
Réponses:
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 -modèles
Réponse originale de 2011:
J'ai eu le même problème il y a environ un an et demi et j'ai trouvé un bon chargeur de modèle sur djangosnippets.org qui facilite les choses . 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 étend le modèle admin / index.html de l'application d'administration. Comme ça:
J'ai donné un exemple complet sur la façon d'utiliser ce chargeur de modèles dans un article de blog sur mon site Web.
la source
django-apptemplates
s'il peut cesser de fonctionner un jour.Quant à Django 1.8 étant la version actuelle, il n'est pas nécessaire de créer un lien symbolique, de copier l'admin / templates dans votre dossier de projet ou d'installer des middlewares comme suggéré par les réponses ci-dessus. Voici ce qu'il faut faire:
créer l'arborescence suivante (recommandée par la documentation officielle )
Remarque : l'emplacement de ce fichier n'est pas important. Vous pouvez le mettre dans votre application et cela fonctionnera toujours. Tant que son emplacement peut être découvert par django. Ce qui est plus important, c'est que le nom du fichier HTML doit être le même que le nom du fichier HTML d'origine fourni par django.
Ajoutez ce chemin de modèle à votre settings.py :
Identifiez le nom et le bloc que vous souhaitez remplacer. Ceci est fait en regardant dans le répertoire admin / templates de django. J'utilise virtualenv, donc pour moi, le chemin est ici:
Dans cet exemple, je souhaite modifier le formulaire d'ajout d'un nouvel utilisateur. Le modèle responsable de cette vue est change_form.html . Ouvrez le fichier change_form.html et recherchez le {% block%} que vous souhaitez étendre.
Dans votre change_form.html , écrivez quelque chose comme ceci:
Chargez votre page et vous devriez voir les changements
la source
../
sur le chemin "exetends" et à spécifier le chemin d'origine plus unique{% extends "../../admin/templates/admin/index.html" %}
. lien vers la réponsesi vous devez remplacer le
admin/index.html
, vous pouvez définir le paramètre index_template duAdminSite
.par exemple
et placez votre modèle dans
<appname>/templates/admin/my_custom_index.html
la source
{% extends "admin/index.html" %}
partir de my_custom_index.html et d'avoir cette référence le modèle d'administrateur django sans le copier. Je vous remercie.Avec
django
1.5 (au moins), vous pouvez définir le modèle que vous souhaitez utiliser pour unmodeladmin
voir https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options
Vous pouvez faire quelque chose comme
En
change_form.html
étant un simple modèle html s'étendantadmin/change_form.html
(ou pas si vous voulez le faire à partir de zéro)la source
La réponse de Chengs est correcte, mais selon la documentation de l'administrateur, tous les modèles d'administration ne peuvent pas être écrasés de cette façon: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates
J'ai dû écraser le login.html de l'administrateur et donc mettre le modèle écrasé dans cette structure de dossiers:
(sans le sous-dossier myapp dans l'admin) Je n'ai pas assez de réputation pour commenter le post de Cheng, c'est pourquoi j'ai dû écrire ceci comme nouvelle réponse.
la source
La meilleure façon de le faire est de mettre les modèles d'administration Django dans votre projet. Ainsi, vos modèles seraient en place
templates/admin
alors que les modèles d'administration Django en stock seraient par exempletemplate/django_admin
. Ensuite, vous pouvez faire quelque chose comme ce qui suit:templates / admin / change_form.html
Si vous souhaitez garder les modèles de stock à jour, vous pouvez les inclure avec svn externals ou similaire.
la source
--ignore
argument avecmakemessages
. Voir: docs.djangoproject.com/en/dev/ref/django-admin/#makemessagesJe n'ai pas trouvé une seule réponse ou une section dans la documentation officielle de Django qui contenait toutes les informations dont j'avais besoin pour remplacer / étendre les modèles d'administrateur par défaut, j'écris donc cette réponse comme un guide complet, en espérant que ce serait utile pour d’autres à l’avenir.
En supposant la structure de projet Django standard:
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 dessus pour les afficher sur votre site d'administration personnalisé (si vous le souhaitez).Dans
mysite/apps.py
, créez une sous-classe deAdminConfig
et définissez surdefault_site
àadmin.CustomAdminSite
partir de l'étape précédente:En
mysite/settings.py
, remplacerdjango.admin.site
dansINSTALLED_APPS
avecapps.CustomAdminConfig
(votre config app admin personnalisé à partir de l'étape précédente).Dans
mysite/urls.py
, remplacezadmin.site.urls
de l'URL d'administration parcustom_admin_site.urls
Créez le modèle que vous souhaitez modifier dans votre
templates
répertoire, en conservant la structure de répertoire par défaut des modèles d'administration Django comme spécifié dans la documentation . Par exemple, si vous modifiezadmin/index.html
, créez le fichiertemplates/admin/index.html
.Tous les modèles existants peuvent être modifiés de cette manière, et leurs noms et structures peuvent être trouvés dans le code source de Django .
Vous pouvez maintenant remplacer le modèle en l'écrivant à partir de zéro ou l'étendre, puis remplacer / étendre des blocs spécifiques.
Par exemple, si vous vouliez tout conserver tel
content
quel, mais que vous vouliez remplacer le bloc (qui sur la page d'index répertorie les applications et leurs modèles que vous avez enregistrés), ajoutez ce qui suit àtemplates/admin/index.html
:Pour conserver le contenu original d'un bloc, ajoutez
{{ block.super }}
là où vous voulez que le contenu original soit affiché:Vous pouvez également ajouter des styles et des scripts personnalisés en modifiant les blocs
extrastyle
etextrahead
.la source
Je suis d'accord avec Chris Pratt. Mais je pense qu'il est préférable de créer le lien symbolique vers le dossier Django d'origine où se trouvent les modèles d'administration:
et comme vous pouvez le voir, cela dépend de la version de python et du dossier dans lequel Django est installé. Ainsi, à l'avenir ou sur un serveur de production, vous devrez peut-être modifier le chemin.
la source
Ce site avait une solution simple qui fonctionnait avec ma configuration Django 1.7.
PREMIER: Créez un lien symbolique nommé admin_src dans le répertoire template / de votre projet vers vos templates Django installés. Pour moi sur Dreamhost utilisant un virtualenv, mes modèles d'administration Django «source» étaient dans:
DEUXIÈME: Créez un répertoire d' administration dans les modèles /
Le template / répertoire de mon projet ressemblait maintenant à ceci:
TROISIEME: Dans votre nouveau répertoire template / admin /, créez un fichier base.html avec ce contenu:
QUATRIÈME: Ajoutez votre admin favicon-admin.ico dans votre dossier racine statique img.
Terminé. Facile.
la source
pour l'index d'application, ajoutez cette ligne à un fichier py commun comme url.py
pour l'index du module d'application: ajoutez cette ligne à admin.py
pour la liste des modifications: ajoutez cette ligne à la classe d'administration:
pour le modèle de formulaire de module d'application: ajoutez cette ligne à votre classe d'administration
etc. et en trouver d'autres dans les mêmes classes de module d'administration
la source
Vous pouvez utiliser django-overextends , qui fournit un héritage de modèle circulaire pour Django.
Il provient du CMS Mezzanine , d'où Stephen l'a extrait dans une extension Django autonome.
Vous trouverez plus d'informations dans "Overriding vs Extending Templates" (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) dans la documentation Mezzanine.
Pour en savoir plus, consultez le blog Stephens "L'héritage de modèle circulaire pour Django" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).
Et dans Google Groupes la discussion (https: /groups.google.com/forum / #! Topic / mezzanine-users / sUydcf_IZkQ) qui a démarré 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 fournissent des informations de base intéressantes. J'ai donc laissé une barre oblique après "http (s):". Peut-être que quelqu'un de meilleure réputation pourra réparer les liens et supprimer cette note.
la source