web-dev-qa-db-fra.com

Django: comment servir les médias / feuilles de style et les lier dans des modèles

Des variantes de cette question ont été posées, mais je ne parviens toujours pas à charger correctement mes feuilles de style lorsque mes modèles sont rendus.

J'essaie de servir des médias statiques à partir du processus Django pendant le développement - ce qui est fortement déconseillé en production, je le sais. Je publierai ma configuration et mon modèle, et j'espère que quelqu'un pourra aidez-moi à comprendre où je me trompe.

Notez que j'ai essayé de suivre l'exemple sur le site Web du projet Django, mais il ne mentionne pas comment faire référence à vos feuilles de style à partir d'un modèle. J'ai également essayé de nombreuses variantes différentes de la même chose, donc mon code/paramètres peut être un peu différent de ce qui est décrit.

settings.py

MEDIA_ROOT = 'D:/Dev Tools/Django_projects/dso/media'
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py

from Django.conf.urls.defaults import *
from Django.conf import settings
from Django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
    (r'^ovramt/$', 'dso.ovramt.views.index'),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
    )

Dans mon modèle:

<head> 
<title> {% block title %} DSO Template {% endblock %} </title> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<link rel="stylesheet" type="text/css" href="../media/styles.css">
</head>

Je vous assure que les fichiers (modèles/supports) sont dans le bon répertoire sur mon système de fichiers. S'il y a des informations supplémentaires que je dois fournir, veuillez poster un commentaire.


Éditer:

L'un des problèmes que je rencontrais était l'utilisation d'un "/" avant mes liens. Si la barre oblique est ajoutée au début, le lien est ouvert à la racine du site. S'il n'y a pas de barre oblique, le lien est ouvert au niveau actuel. Un exemple:

www.example.com/application/ a un lien "/ app2/et un lien" app3/".
app2 s'ouvrira sur www.example.com/app2/ et app3 s'ouvrira sur www.example.com/application/app3/. Cela me déroutait, je pense.

43
Josh Smeaton

Je devais juste comprendre cela moi-même.

settings.py:

MEDIA_ROOT = 'C:/Server/Projects/project_name/static/'
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py:

from Django.conf import settings
...
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'Django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
    )

fichier modèle:

<link rel="stylesheet" type="text/css" href="/static/css/style.css" />

Avec le fichier situé ici:

"C:/Server/Projects/project_name/static/css/style.css"
51
Ty.

Django a déjà un processus de contexte pour MEDIA_URL, voir documentation de Django .

Il doit être disponible par défaut (sauf si vous avez personnalisé CONTEXT_PROCESSORS et oublié de l'ajouter) dans un RequestContext.

11
Meir Kriheli

Je crée généralement ma propre balise simple Template parce que Django ne donne pas de fichiers CSS/JavaScript. Apache le fait donc mon URL média est généralement http://static.mysite.com .

yourApp/templatetags/media_url.py:

from Django.template import Library
from yourapp.settings import MEDIA_URL
register = Library()

@register.simple_tag
def media_url():
    return MEDIA_URL

Et dans mon fichier modèle:

{% load media_url %}
<link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css">

Vous pouvez également faire votre propre préprocesseur de contexte pour ajouter la variable media_url dans chaque modèle.

6
bchhun

J'utilise simplement un nom absolu. À moins que vous exécutiez le site dans un chemin profond (ou même si vous l'êtes), je laisserais tomber le .. et optez pour quelque chose comme:

<link rel="stylesheet" type="text/css" href="/media/styles.css">
2
Oli

Je pensais juste que je sonnerais rapidement. Bien que toutes les propositions ici fonctionnent très bien, et j'utilise l'exemple de Ty lors du développement, une fois que vous avez atteint la production, vous voudrez peut-être choisir de servir des fichiers via un Apache simple, ou quel que soit le serveur que vous utilisez.

Ce que je fais, c'est que je configure un sous-domaine une fois que j'ai fini de développer et que je remplace tous les liens vers des supports statiques. Par exemple:

<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />

Les raisons pour cela sont doubles. Premièrement, il semble juste que ce serait plus lent d’avoir Django gérer ces requêtes quand ce n’est pas nécessaire. Deuxièmement, puisque la plupart des navigateurs peuvent réellement télécharger des fichiers simultanément à partir de 3 domaines différents, en utilisant un second sous- Le domaine de vos fichiers statiques accélérera en fait la vitesse de téléchargement de vos utilisateurs.

1
David

J'ai quelques idées, je ne sais pas laquelle travaille pour moi :)

Veillez à utiliser une barre oblique de fin et à ce qu'elle soit différente du paramètre MEDIA_URL (car la même URL ne peut pas être mappée sur deux ensembles de fichiers différents).

Cela vient de http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix

Deuxièmement, il se peut que vous confondiez les répertoires de votre système de fichiers avec les chemins d'URL. Essayez d'utiliser des URL absolues, puis affinez-les.

1
sykora

Une autre chose à ajouter est que si vous avez un serveur multimédia séparé sur un sous-domaine/domaine différent, vous pouvez désactiver les cookies pour votre support statique. Économise un peu de traitement et de bande passante.

0
datashaman