2009-06-21 3 views
36

Dans les modèles de django, il est fréquent de faire ce qui suit:Django URL des médias dans les fichiers CSS

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

Comment voulez-vous accomplir cela dans un fichier CSS qui n'est pas servi 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 la capacité de servir mes fichiers soit à partir du sous-domaine des médias, ou pendant le travail hors ligne et les servir directement en vue statique django. Mais les fichiers CSS sont un problème car ils ne sont pas traités en tant que modèles et je ne peux pas utiliser la variable de contexte MEDIA_URL.

Quelle est la solution?

Edit: Je dois souligner que le problème se pose depuis mes fichiers médias statiques sont en fait situés sur un sous-domaine de média distinct, niant ainsi l'utilisation de chemins relatifs. J'ai compris, merci!

Répondre

45

D'où provient votre fichier css? Ceci est généralement pas un problème en tant que structure de médias communs tels que:

media/ 
    images/ 
    css/ 
    js/ 

(ou similaire) permet 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 multimédia pour accueillir des chemins de fichiers relatifs, vous pouvez avoir d'autre choix que de remplacer les déclarations css à partir du modèle, en utilisant un fichier css secondaire en mode hors connexion:

{% 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.

3

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

0

Si vous souhaitez utiliser des directives de modèle dans un fichier, pourquoi ne les utilise-t-il pas via un modèle?

6

Désolé, vous ne serez pas satisfait de la réponse.

J'ai le même problème:

Il n'y a pas de moyen facile de le faire avec les fichiers CSS statiques servis.

Ce que je fais:

  • serveur de débogage, travailler localement, les médias ont servi localement
  • serveur de production est hébergé quelque part commerciale w/media sur Amazon S3
  • fixe automatique de fichiers settings.py MEDIA_URL (dEBUG, etc.) via le nom d'hôte chèque (pour différencier la production locale par rapport à/home/debug)
  • fichiers HTML ont tous des liens avec css {{MEDIA_URL}} (+ RequestContext contextes pour les vues)
  • J'aime les noms de chemin absolu, donc un script "update_s3": (1) modifie chaque fichier est temporairement css pour fixer 'url ("/ media' à 'url (" s3.mydomain.com/media » et (2) mises à jour/uploads mon répertoire/médias pour Amazon S3

Je vais alors à la production et faire une mise à jour svn & toucher le fichier WSGI & validate