Question

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 les médias statiques du processus Django au cours du développement - ce qui est fortement déconseillé en production, à ma connaissance. Je publierai ma configuration et mon modèle, et j'espère que quelqu'un pourra m'aider à comprendre où je me trompe.

Notez que j’ai essayé de suivre l’exemple du site Web du projet Django, mais ne mentionne pas comment faire référence à vos feuilles de style à partir d’un modèle. J'ai également essayé de nombreuses variantes de la même chose, mon code et mes paramètres sont peut-être un peu différents 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/

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) se trouvent dans le bon répertoire sur mon système de fichiers. Si vous souhaitez fournir des informations supplémentaires, veuillez poster un commentaire.

Modifier:

L'un des problèmes que je rencontrais était l'utilisation d'un '/' qui préfixait mes liens. Si la barre oblique est ajoutée au début, le lien est ouvert à partir de 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 à www.example.com/app2/ et app3 s'ouvrira à www.example.com/application/app3/. Cela me déroutait je pense.

, 'dso.ovramt.views.index'), ) if settings.DEBUG: urlpatterns += patterns('', (r'^media/(?P<path>.*)

Dans mon modèle:

<*>

Je vous assure que les fichiers (modèles / supports) se trouvent dans le bon répertoire sur mon système de fichiers. Si vous souhaitez fournir des informations supplémentaires, veuillez poster un commentaire.

Modifier:

L'un des problèmes que je rencontrais était l'utilisation d'un '/' qui préfixait mes liens. Si la barre oblique est ajoutée au début, le lien est ouvert à partir de 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 à www.example.com/app2/ et app3 s'ouvrira à www.example.com/application/app3/. Cela me déroutait je pense.

, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), )

Dans mon modèle:

<*>

Je vous assure que les fichiers (modèles / supports) se trouvent dans le bon répertoire sur mon système de fichiers. Si vous souhaitez fournir des informations supplémentaires, veuillez poster un commentaire.

Modifier:

L'un des problèmes que je rencontrais était l'utilisation d'un '/' qui préfixait mes liens. Si la barre oblique est ajoutée au début, le lien est ouvert à partir de 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 à www.example.com/app2/ et app3 s'ouvrira à www.example.com/application/app3/. Cela me déroutait je pense.

Était-ce utile?

La solution

Il me suffisait de 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>.*)

fichier de 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"
, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), )

fichier de modèle:

<*>

Avec le fichier situé ici:

<*>

Autres conseils

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

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

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

votreApp / 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 de modèle:

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

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

Je viens d'utiliser un nom absolu. Sauf si vous exécutez le site dans un chemin profond (ou même si vous l'êtes), je supprimerais le .. et choisirais quelque chose comme:

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

J'ai quelques idées, je ne sais pas laquelle d’entre elles me convient:)

  

Veillez à utiliser une barre oblique finale et à la différencier du paramètre MEDIA_URL (car la même URL ne peut pas être mappée sur deux ensembles de fichiers différents).

Il s'agit de http: //docs.djangoproject. com / fr / 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.

Je pensais juste que je pourrais entrer rapidement. Bien que toutes les propositions ici fonctionnent très bien et que j'utilise l'exemple de Ty lors de son développement, une fois en production, vous voudrez peut-être choisir de servir les fichiers via un Apache direct ou tout autre serveur que vous utilisez.

Ce que je fais est de configurer un sous-domaine une fois mon développement terminé et de remplacer 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 semblerait que ce serait plus lent de laisser Django traiter ces demandes quand ce n’est pas nécessaire. Deuxièmement, étant donné que la plupart des navigateurs peuvent effectivement télécharger des fichiers simultanément de 3 domaines différents, l’utilisation d’un deuxième sous-domaine pour vos fichiers statiques accélérera la vitesse de téléchargement de vos utilisateurs.

Une autre chose à ajouter est que si vous avez un serveur de médias distinct sur un sous-domaine / un domaine différent, vous pouvez désactiver les cookies pour votre média statique. Enregistre un peu de traitement et de bande passante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top