Django-fr

Forum

#1 10-06-2012 15:54:29

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Django admin personnalisé alwaysdata

Bonjour,

Je souhaites personnaliser l'interface d'admin de django. J'héberge mon site chez alwaysdata, c'est la première fois que je ne développe pas en local et j'avoue ne pas y comprendre grand chose aux variables suivantes dans le fichier settings.py:

MEDIA_ROOT = '/home/xxxxx/mmb/public/site_media/'

MEDIA_URL = '/site_media/'

STATIC_ROOT = '/static/'

STATIC_URL = '/static_url/'

ADMIN_MEDIA_PREFIX = '/site_media/'

J'ai copié les templates admin situés dans contrib/admin de django dans un dossier de mon projet situé dans mmb/admin_media dans lequel il y a les dossiers de template "admin" et "register". J'ai du mal à comprendre comment définir les chemins de mes propres templates d'admin.

Merci d'avance.

Dernière modification par torrak (10-06-2012 16:23:52)

Hors ligne

#2 10-06-2012 16:21:49

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Django admin personnalisé alwaysdata

Salut,

La documentation de Django est complète, en cherchant bien tu a toujours une
explication :

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-
templates

Le principe de recherche des templates dans Django est qu'il cherche d'abord
dans le répertoire "templates/" de tes django apps installés, puis cherche
dans chacun des répertoires de templates spécifiés dans
"settings.TEMPLATE_DIRS", le dernier template trouvé écrasant toujours le
précédent.

Bref il te suffit de créer un répertoire "admin/" dans un de tes répertoires de
"settings.TEMPLATE_DIRS" et d'y mettre les templates "globaux" de l'admin que
tu veux modifier. Et si besoin tu peux le faire plus "finement" en modifiant que
les templates que de certaines de tes apps (voir le lien donné plus haut pour
le détail).

Hors ligne

#3 10-06-2012 18:06:04

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Django admin personnalisé alwaysdata

Merci pour cette réponse aussi rapide,

dans mon template_dirs j'ai :

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

Mais dans le code source de la page affichée j'ai :

<link rel="stylesheet" type="text/css" href="/site_media/css/base.css" />
<link rel="stylesheet" type="text/css" href="/site_media/css/login.css" />

Donc il ne va pas vraiment chercher dans mes templates....

ça ne marche toujours pas.

Dernière modification par torrak (10-06-2012 18:06:33)

Hors ligne

#4 10-06-2012 18:35:37

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Django admin personnalisé alwaysdata

Je ne vois pas bien le rapport entre les templates et ton bout de code html
qui montre certains de tes médias CSS.

À mon avis tu confonds quelque chose, réfléchis y et repose ta question au
complet parce que là je ne vois pas ce que tu veux.

Hors ligne

#5 15-06-2012 08:55:16

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Django admin personnalisé alwaysdata

Effectivement, je me suis aperçu de mon erreur car les ccs ne sont pas du tout situés au même endroit que l'admin.

Je vais essayer de creuser un peu tout ça et je reviens vers vous si j'ai des questions.

Merci pour vos réponses

Hors ligne

#6 20-06-2012 11:12:58

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : Django admin personnalisé alwaysdata

Bonjour,

Attention à ne pas confondre les templates et les fichiers css, javascript
etc...
Tu dois collecter les fichiers statics de l'admin pour modifier ceux qui
t'intéressent et spécifier dans ton STATICFILE_DIRS, le dossier où se
trouve tes fichiers modifiés.
J'imagine que tu veux modifier les css. Donc avec un python manage.py
collecstatic, tu vas récupérer l'arborescence de tout les statics de ton
projet. Ensuite tu gardes seulement les fichiers que tu veux modifier en
préservant toujours l'arborescence.

Mon explication manque très certainement de clarté.
Je te laisse jeter un oeil ici:
http://stackoverflow.com/questions/6427523/custom-stylesheets-in-django-1-3-admin
et ici:
http://stackoverflow.com/questions/5152026/django-admin-media-prefix-url-issue
puis la:
https://docs.djangoproject.com/en/1.3/howto/static-files/#serving-static-files-in-development

En espérant avoir que cela puisse te sortir de l'angoisse wink
Le 15 juin 2012 09:55, polo <carrotpaul _AT_ yahoo.fr> a écrit :

> Effectivement, je me suis aperçu de mon erreur car les ccs ne sont pas du
> tout situés au même endroit que l'admin.
>
> Je vais essayer de creuser un peu tout ça et je reviens vers vous si j'ai
> des questions.
>
> Merci pour vos réponses
>  _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#7 22-06-2012 13:51:24

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Django admin personnalisé alwaysdata

Je commance par du général, et je réponds à votre question à la fin.

Les fichiers HTML peuvent être mis dans dossier nommé "templates" DANS LE DOSSIER D'UNE APPLICATION, pour être découverts automatiquement.

Par exemple:

project/
└── une_app
    └── templates
        └── index.html

Alors on pourra utiliser le template render(request, 'index.html', context).

MAIS !

Si on a une arborescence avec un sous dossier de plus:

project/
└── une_app
    └── templates
        └── une_app
            └── index.html

Alors il faut inclure le sous dossier dans le nom du template: on pourra utiliser render(request, 'une_app/index.html', context).

CECI EST TRES COMMUN.

En effet, toutes les apps ont un template index.html, et comme Django charge toujours le premier template qu'il voit avec ce nom, c'est une bonne pratique de mettre son template dans un sous-dossier portant le nom de son app. De cette manière, on évite que Django choisisse le mauvais index.html. C'est assez moche, car du coup on a une_app/templates/une_app/fichier.html mais, c'est le status quo dans Django.

L'admin utilise ce procédé, et donc pour overrider un fichier.html de l'admin, il faut créer:

project/
└── une_app
    └── templates
        └── admin  <======= dans VOTRE APP, mettre les overrides ici
            └── fichier.html

N'oubliez pas également que l'ordre de chargement des applications a de l'importance. Je vous recommande donc de mettre votre app AVANT django.contrib.admin dans INSTALLED_APP si vous souhaitez overrider des templates.

Dernière modification par ksamuel (22-06-2012 13:54:10)

Hors ligne

#8 17-07-2012 15:32:20

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Django admin personnalisé alwaysdata

Re Bonjour,

Je reviens vers vous car je crois avoir compris quelques petites choses mais c'est pas encore ça...

Tout d'abord merci pour toutes vos réponses et votre implication.

Petites précisions, je suis sous django 1.4 sur mon serveur de développement.

J'arrive a bien aller chercher mes templates admin customisés par contre j'ai un véritable problème avec les fichiers static css de l'interface d'admin.

Voici mon settings.py

MEDIA_ROOT = '/home/pololo/mmb/public'
MEDIA_URL = '/site_media/'
STATIC_ROOT = '/home/pololo/mmb/public'
STATIC_URL = '/static/'

et mon arborescence

mmb/
-settings.py
-urls.py
-etc...
-mon_app/
    -models.py
    -views.py
    -etc...
-public/ (contenant mes fichiers static et media)
    -static
       -admin
             -admin
             -css
             -js
    -site_media

De plus j'ai mis :

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'public/static/admin').replace('\\', '/'),
    os.path.join(os.path.dirname(__file__), 'mon_app/templates').replace('\\', '/'),
)

et

STATICFILES_DIRS = (  
     os.path.join(os.path.dirname(__file__), 'public/static/admin').replace('\\', '/'),
)

J'ai l'impression de toucher à toutes les manettes sans comprendre trop à quoi je touche, et finalement je n'arrive jamais au résultat attendu, a part pour les fichiers admin personnalisés qui sont bien là où ils doivent être..

Dernière modification par torrak (17-07-2012 15:35:33)

Hors ligne

#9 17-07-2012 15:41:29

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Django admin personnalisé alwaysdata

On recommence à zéro. Pour savoir d'où on part, nous allons avoir
besoin:

- de ce que vous avez compris (d'après nos explications) de toutes les
variables dont nous avons parlé précédemment;
- de ce que vous avez mis dedans, avec quelle idée en tête, et en
espérant quel résultat;
- de ce que vous avez obtenu en fin de compte.

Il va falloir être exhaustif et précis. Écrivez un très long poste,
point par point, ligne par ligne. Pas de raccourci.

from debug import dump
import ipdb

dump(config)
dump(cerveau)
ipdb.set_trace()

Le mar. 17 juil. 2012 16:32:21 CEST, polo a écrit :
> Re Bonjour,
>
> Je reviens vers vous car je crois avoir compris quelques petites choses
> mais c'est pas encore ça...
>
> Tout d'abord merci pour toutes vos réponses et votre implication.
>
> Petites précisions, je suis sous django 1.4 sur mon serveur de
> développement.
>
> J'arrive a bien aller chercher mes templates admin customisés par contre
> j'ai un véritable problème avec les fichiers static.
>
> Voici mon settings.py
>

> MEDIA_ROOT = '/home/pololo/mmb/public'
> MEDIA_URL = '/site_media/'
> STATIC_ROOT = '/home/pololo/mmb/public'
> STATIC_URL = '/static/'
>

>
> et mon arborescence
>
> mmb/
>  -settings.py
>  -urls.py
>  -etc...
>  -mon_app/
>     -models.py
>     -views.py
>     -etc...
>  -public/ (contenant mes fichiers static et media)
>     -static
>        -admin
>              -admin
>              -css
>              -js
>     -site_media
>
> De plus j'ai mis :
>
>

> TEMPLATE_DIRS = (
>     os.path.join(os.path.dirname(__file__),
> 'public/static/admin').replace('\\', '/'),
>     os.path.join(os.path.dirname(__file__),
> 'mon_app/templates').replace('\\', '/'),
> )
>

>
> et
>
>

> STATICFILES_DIRS = (
>      os.path.join(os.path.dirname(__file__),
> 'public/static/admin').replace('\\', '/'),
> )
>

>
> J'ai l'impression de toucher à toutes les manettes sans comprendre trop
> à quoi je touche, et finalement je n'arrive jamais au résultat attendu, a
> part pour les fichiers admin personnalisés qui sont bien là où ils
> doivent être..
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#10 17-07-2012 15:56:13

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Django admin personnalisé alwaysdata

Par ailleurs, puisqu'il va nous falloir des dump de fichier complets (comme le settings.py), il faudra nous les dumper dans un pastebin (http://pastebin.archlinux.fr/, http://pastebin.com/, 0bin.net, etc)

Merci aussi de préciser tout le setup de l'environnement (dossier racine, droits d'accès, type de serveur (apache, nginx, etc) et de reverse proxy (gunicorn, uwsgi, etc)).

Hors ligne

#11 18-07-2012 08:40:51

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : Django admin personnalisé alwaysdata

Bonjour,

Je viens de comprendre mon erreur qui est certes très bête mais qui me remonte le moral. En effet, ma configuration est correcte... Je vous explique donc la source de mon erreur.
Je développais mon application sous Django 1.3.1, tout marchait très bien, j'avais copié mes fichiers static et admin (admin et css) dans un répertoire situé sur mon serveur dans lequel je pointais pour aller chercher mon interface d'admin que je souhaitais modifier.
Puis j'ai voulu upgrader Django et je suis passé à la version 1.4. Sauf que je n'ai pas recopié les nouveaux fichiers static et admin relatif à Django 1.4 dans mon répertoire contenant mes fichiers static. Or dans cette nouvelle mouture de django, le variable ADMIN_MEDIA_PREFIX n'existe plus ce qui faisait planter le cheminement.

voilà, mon erreur est résolue. Je vous remercie pour votre implication dans la résolution de ce problème.

Je crains néanmoins que vous alliez me revoir très régulièrement sur ce forum plein de réactivité.

Merci

Hors ligne

#12 18-07-2012 09:48:33

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : Django admin personnalisé alwaysdata

:-D

Le mer. 18 juil. 2012 09:40:51 CEST, polo a écrit :
> Bonjour,
>
> Je viens de comprendre mon erreur qui est certes très bête mais qui me
> remonte le moral. En effet, ma configuration est correcte... Je vous
> explique donc la source de mon erreur.
> Je développais mon application sous Django 1.3.1, tout marchait très
> bien, j'avais copié mes fichiers static et admin (admin et css) dans un
> répertoire situé sur mon serveur dans lequel je pointais pour aller
> chercher mon interface d'admin que je souhaitais modifier.
> Puis j'ai voulu upgrader Django et je suis passé à la version 1.4. Sauf
> que je n'ai pas recopié les nouveaux fichiers static et admin relatif à
> Django 1.4 dans mon répertoire contenant mes fichiers static. Or dans
> cette nouvelle mouture de django, le variable ADMIN_MEDIA_PREFIX n'existe
> plus ce qui faisait planter le cheminement.
>
> voilà, mon erreur est résolue. Je vous remercie pour votre implication
> dans la résolution de ce problème.
>
> Je crains néanmoins que vous alliez me revoir très régulièrement sur
> ce forum plein de réactivité.
>
> Merci
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

Pied de page des forums