36 votes

URLs de médias Django dans les fichiers CSS

Dans les modèles de django, il est courant de faire ce qui suit :

<img src="{{ MEDIA_URL }}/img/someImage.jpg">

Comment réaliser cela dans un fichier CSS qui n'est pas utilisé comme modèle ?

.someClass {
    /* can't do this this */
    background: url("{{ MEDIA_URL }}/img/someImage.jpg");        
    /* either this */
    background: url("http://media.domain.com/img/someImage.jpg");
    /* or this */
    background: url("/django_static_media/img/someImage.jpg");
    /* can't do both... what to do? */
}

J'ai besoin de la possibilité de servir mes fichiers soit à partir du sous-domaine media, soit pendant le travail hors ligne et de les servir directement comme une vue statique django. Mais les fichiers CSS posent un problème car ils ne sont pas traités comme des modèles et je ne peux pas utiliser la fonction MEDIA_URL variable de contexte.

Quelle est la solution ?

Edit : Je dois noter que le problème se pose car mes fichiers de médias statiques sont en fait situés sur un sous-domaine média distinct, ce qui rend inutile l'utilisation de chemins relatifs. Je l'ai, merci !

47voto

ozan Points 3851

D'où provient votre fichier css ? Ce n'est généralement pas un problème car une structure de média commune telle que :

media/
    images/
    css/
    js/

(ou similaire) permet d'utiliser des chemins de fichiers relatifs pour les images, par exemple :

background: url('../images/foo.png');

Si vous n'êtes pas prêt à modifier la structure de votre dossier de médias pour tenir compte des chemins de fichiers relatifs, vous n'aurez peut-être pas d'autre choix que d'écraser les déclarations css à partir du modèle, en utilisant un fichier css secondaire lorsque vous êtes hors ligne :

{% if DEBUG %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}css/offline-mode.css" />
{% endif %}

Bien sûr, la première option est beaucoup plus ordonnée.

6voto

joej Points 546

Désolé, vous n'aimerez pas la réponse.

J'ai le même problème :

Il n'y a pas de moyen facile de le faire avec des fichiers CSS à service statique.

Ce que je fais :

  • serveur de débogage, travail en local, médias servis en local
  • Le serveur de production est hébergé dans un endroit commercial avec des médias sur Amazon S3.
  • Le fichier settings.py définit automatiquement MEDIA_URL (DEBUG, etc.) via la vérification du nom d'hôte (pour différencier la production de l'environnement local/home/debug).
  • Les fichiers HTML ont tous des liens css avec {{MEDIA_URL}} (+RequestContext contextes pour les vues)
  • J'aime les noms de chemin absolus, donc un "update_s3" script : (1) modifie chaque fichier css est temporairement pour corriger 'url("/media" en 'url("s3.mydomain.com/media" et (2) met à jour/télécharge mon répertoire /media sur Amazon S3

Je vais ensuite en production et fais une mise à jour svn & touche le fichier WSGI & valide

3voto

ayaz Points 6910

L'utilisation de chemins relatifs (pour les fichiers image) dans vos fichiers CSS n'est pas une option viable pour vous ?

0voto

ironfroggy Points 3496

Si vous voulez utiliser des directives de modèle dans un fichier, pourquoi n'est-il pas servi par un modèle ?

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