144 votes

Comment remplacer et étendre les modèles d'administration de base de Django ?

Comment puis-je remplacer un modèle d'administration (par exemple admin/index.html) tout en l'étendant (cf. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template ) ?

Tout d'abord, je sais que cette question a déjà été posée et qu'il y a déjà été répondu (cf. Django : Remplacer ET étendre un modèle d'application ) mais comme le dit la réponse, ce n'est pas directement applicable si vous utilisez le chargeur de modèles app_directories (ce qui est le cas la plupart du temps).

Ma solution actuelle est de faire des copies et d'étendre à partir de celles-ci au lieu d'étendre directement à partir des modèles d'administration. Cela fonctionne très bien, mais c'est vraiment déroutant et cela ajoute du travail supplémentaire lorsque les modèles d'administration changent.

Je pourrais penser à une extension personnalisée pour les modèles, mais je ne veux pas réinventer la roue s'il existe déjà une solution.

Par ailleurs, quelqu'un sait-il si ce problème sera résolu par Django lui-même ?

1 votes

Copier les modèles d'administration, les étendre et remplacer/ajouter des blocs est le processus le plus efficace, bien que non optimal, compte tenu de l'état actuel de Django. Je n'ai pas vu d'autre moyen de faire ce que vous essayez de faire en trois ans de travail avec Django :)

0 votes

Je ne sais pas si c'est une bonne chose ou non, mais au moins des gens comme vous sont arrivés à la même conclusion. C'est bon à entendre. :)

113voto

heyman Points 2311

Mise à jour :

Lisez les documents relatifs à votre version de Django, par ex.

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 https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#admin-overriding-templates

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 joli chargeur de modèles sur djangosnippets.org qui rend cela facile. Il vous permet d'étendre un modèle dans une application spécifique, vous donnant ainsi la possibilité de créer votre propre admin/index.html qui étend le modèle admin/index.html de l'application d'administration. Comme ceci :

{% extends "admin:admin/index.html" %}

{% block sidebar %}
    {{block.super}}
    <div>
        <h1>Extra links</h1>
        <a href="http://stackoverflow.com/admin/extra/">My extra link</a>
    </div>
{% endblock %}

J'ai donné un exemple complet sur la façon d'utiliser ce chargeur de modèles dans un fichier article de blog sur mon site web.

18 votes

Pour référence ; le snippet en question a été converti en une application django, et est disponible dans PyPi (pip/easy_install) sous le nom de django-apptemplates : pypi.python.org/pypi/django-apptemplates

9 votes

Juste pour être 100% explicite : la solution ci-dessus ne fonctionnera PLUS pour les versions récentes de Django (au moins 1.4), car l'une des fonctions que le script utilise est dépréciée. Vous pouvez trouver la source mise à jour ici

2 votes

Notez qu'avec Django 1.8, cela fonctionnera toujours, mais la configuration doit être faite d'une manière spéciale (voir app_namespace.Loader setup à titre d'exemple). django-app-namespace-template-loader est également une alternative fonctionnelle à django-apptemplates si elle peut cesser de fonctionner un jour.

60voto

Yoav Aner Points 1275

Si vous devez écraser le admin/index.html vous pouvez régler le Modèle d'index du paramètre AdminSite .

par exemple

# urls.py
...
from django.contrib import admin

admin.site.index_template = 'admin/my_custom_index.html'
admin.autodiscover()

et placez votre modèle dans <appname>/templates/admin/my_custom_index.html

5 votes

Brillant ! En faisant cela, vous pouvez ensuite faire {% extends "admin/index.html" %} de mon_custom_index.html et faire en sorte qu'il fasse référence au modèle d'administration de django sans le copier. Merci.

3 votes

@Semmel devrait marquer cette réponse comme étant la bonne, car il s'agit de l'approche la plus simple qui utilise les fonctionnalités intégrées de Django et ne nécessite pas l'utilisation de chargeurs de modèles personnalisés.

21voto

maazza Points 1092

Avec django 1.5 (au moins), vous pouvez définir le modèle que vous souhaitez utiliser pour un projet particulier. modeladmin

voir https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options

Vous pouvez faire quelque chose comme

class Myadmin(admin.ModelAdmin):
    change_form_template = 'change_form.htm'

Avec change_form.html étant un simple modèle html qui s'étend admin/change_form.html (ou pas si vous voulez le faire à partir de zéro)

5voto

Chris Pratt Points 53859

La meilleure façon de procéder est de placer les modèles d'administration Django dans votre projet. Ainsi, vos modèles seront dans templates/admin alors que les modèles d'administration de Django se trouvent dans le répertoire suivant template/django_admin . Ensuite, vous pouvez faire quelque chose comme ce qui suit :

templates/admin/change_form.html

{% extends 'django_admin/change_form.html' %}

Your stuff here

Si vous êtes soucieux de maintenir les modèles de base à jour, vous pouvez les inclure avec svn externals ou similaire.

0 votes

Utiliser les externes de svn est une excellente idée. Le problème que cela introduit est que tous mes traducteurs vont traduire tous ces modèles (parce que makemessages va collecter les chaînes de traduction de tous les modèles d'administration) ce qui ajoute beaucoup de travail supplémentaire si vous travaillez avec plusieurs langues. Peut-être y a-t-il un moyen d'exclure ces modèles de makemessages ?

0 votes

Utilisez le --ignore argument avec makemessages . Voir : docs.djangoproject.com/fr/dev/ref/django-admin/#makemessages

0 votes

Je pense que l'autre réponse répond mieux à mon besoin. Mais j'aime votre solution et je pense que c'est une bonne alternative si vous ne voulez pas vous embêter avec vos chargeurs de modèles.

1voto

James May Points 54

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 original où se trouvent les modèles d'administration :

ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/ templates/django_admin

et comme vous pouvez le voir, cela dépend de la version de python et du dossier où Django est installé. Ainsi, à l'avenir ou sur un serveur de production, vous devrez peut-être modifier le chemin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X