Django: comment vous servir des médias / feuilles de style et le lien à l'intérieur de modèles
Variations de cette question ont été posées, mais je suis toujours incapable d'obtenir mes feuilles de style pour charger correctement lors de mes modèles sont rendus.
Je suis d'essayer de servir statique des médias de l'Django processus au cours du développement - ce qui est fortement déconseillé dans la production, je suis au courant. Je vais poster ma configuration et mon modèle, et j'espère que quelqu'un peut m'aider à comprendre où je vais mal.
Noter que j'ai essayé de suivre l'exemple du projet Django site, mais il ne mentionne pas comment consulter vos feuilles de style à partir d'un modèle. J'ai aussi essayé beaucoup de différentes variations de la même chose, donc mon code/paramètres peut être un peu hors 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 template:
<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, les fichiers (modèles/media) sont dans le bon répertoire sur mon système de fichiers. Si il n'y a aucune information supplémentaire j'ai besoin de fournir, s'il vous plaît poster un commentaire.
Edit:
L'un des problèmes que j'avais était l'utilisation d'un '/' ajoutant à mes liens. Si la barre oblique est ajouté, le lien est ouvert à partir de la racine du site. Si il n'y a pas de barre oblique, le lien est ouvert dans le niveau actuel. Un exemple:
www.example.com/application a un lien "/app2/et un lien "app3/".
app2 sera ouvert à partir de www.example.com/app2/et app3 sera ouvert à partir de www.example.com/application/app3/. C'était déroutant, moi, je pense.
- Une question; avez-vous essayé de chargement "http://<votre-serveur-probablement-localhost>/media/styles.css" directement à partir de votre navigateur?
- Je suis le seul qui trouve ça idiot que vous devez sauter à travers tous ces cerceaux de test/preview CSS et les images en cours de développement avec Django? Bien sûr, vous ne voulez pas faire dans la production et l'utilisation d'un véritable serveur web, mais pour le développement, vous avez besoin de voir des styles/images afin de donner un bon aperçu.
- Il y avait vraiment pas beaucoup de sauter à travers des cerceaux. Je viens de tomber là où je ne devrais pas avoir.
- vous avez dit "Si la barre oblique est ajouté, le lien est ouvert à partir du niveau inférieur." mais en fait, slash fait charger à partir du niveau supérieur. Donc, à partir de site.com/a/b/c si il y a un lien de /d, il va aller à l'site.com/d.
Vous devez vous connecter pour publier un commentaire.
J'ai juste eu à le comprendre moi-même.
settings.py:
urls.py:
fichier de modèle:
Avec le fichier situé ici:
Django a déjà un contexte de processus pour MEDIA_URL, voir De Django reinhardt, de la documentation.
Il devrait être disponible par défaut (sauf si vous avez personnalisé CONTEXT_PROCESSORS et j'ai oublié de l'ajouter) dans un RequestContext.
J'ai l'habitude de faire mon propre Modèle simple balise parce que Django n'est pas de donner des fichiers CSS/JavaScript. Apache t-il donc, ma médias url est généralement http://static.mysite.com.
yourApp/templatetags/media_url.py:
Et dans mon fichier de modèle:
Vous pouvez aussi faire votre propre contexte de préprocesseur pour ajouter le media_url variable dans chaque modèle.
Je viens d'utiliser absolue de nommage. Sauf si vous êtes en cours d'exécution le site dans un profond chemin (ou même si vous êtes), j'aimerais déposer le
..
et aller pour quelque chose comme:J'ai quelques idées, je ne sais pas lequel est le travail pour moi 🙂
C'est à partir de http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix
Autre part, il peut être que vous êtes confus répertoires sur votre système de fichiers avec les chemins d'url. Essayez d'utiliser des url absolues, et ensuite d'affiner le bas.
Juste pensé que je voudrais mentionner rapidement. Alors que toutes les propositions ici fonctionnent très bien, et je ne l'utilisation de Ty exemple lors du développement, une fois que vous avez atteint un niveau de production, vous pourriez opter pour servir des fichiers par l'intermédiaire d'un droit d'Apache, ou n'importe quel autre serveur que vous utilisez.
Ce que je fais est ce que je peux configurer un sous-domaine une fois que je suis terminé la phase de développement, et de le remplacer tous les liens de la statique des médias. Par exemple:
Les raisons pour cela sont de deux ordres. Tout d'abord, il semble juste comme il serait plus lent pour avoir Django gérer ces demandes, quand il n'est pas nécessaire. Deuxièmement, étant donné que la plupart des navigateurs pouvez télécharger les fichiers simultanément à partir de 3 domaines différents, à l'aide d'un deuxième sous-domaine pour vos fichiers statiques sera en fait accélérer la vitesse de téléchargement de vos utilisateurs.
Une autre chose à ajouter, c'est que si vous avez un serveur multimédia sur un sous-domaine/domaine différent, vous pouvez désactiver les cookies de votre statique des médias. Permet d'économiser un peu de traitement et de bande passante.