Были заданы варианты этого вопроса, но я все еще не могу заставить мои таблицы стилей правильно загружаться, когда мои шаблоны отображаются.
Я пытаюсь обслуживать статические носители из процесса Django во время разработки, что, насколько мне известно, в производстве категорически не рекомендуется. Я опубликую свою конфигурацию и свой шаблон, и, надеюсь, кто-нибудь поможет мне понять, в чем я ошибаюсь.
Обратите внимание, что я пытался следовать примеру на веб-сайте проекта Django, однако он не упоминает, как ссылаться на ваши таблицы стилей из шаблона. Я также пробовал много разных вариантов одного и того же, поэтому мой код / настройки могут немного отличаться от описанных.
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}),
)
В моем шаблоне:
<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>
Уверяю вас, файлы (шаблоны / медиа) находятся в правильном каталоге в моей файловой системе. Если мне нужно предоставить дополнительную информацию, оставьте комментарий.
Редактировать:
Одна из моих проблем заключалась в использовании символа '/' перед моими ссылками. Если перед ним стоит косая черта, ссылка открывается из корня сайта. Если косая черта отсутствует, ссылка открывается на текущем уровне. Пример:
www.example.com/application/ содержит ссылку "/ app2 /" и ссылку "app3 /".
app2 откроется по адресу www.example.com/app2/, а app3 откроется по адресу www.example.com/application/app3/. Думаю, это меня сбивало с толку.
Я единственный, кто считает глупым то, что вам нужно перепрыгивать через все эти обручи для тестирования / предварительного просмотра CSS и изображений во время разработки с Django? Конечно, вы не хотите делать это в продакшене и использовать настоящий веб-сервер, но для разработки вам нужно видеть стили / изображения, чтобы иметь хороший предварительный просмотр.
Обручей, через которые нужно было прыгнуть, действительно было не так много. Я просто споткнулся там, где, наверное, не должен был.
вы сказали: «Если перед ним стоит косая черта, ссылка открывается с уровня ниже». но на самом деле косая черта загружает его с самого верхнего уровня. Итак, с site.com/a/b/c, если есть ссылка на / d, она перейдет на site.com/d.






У меня есть пара идей, я не знаю, какая из них мне подходит :)
Make sure to use a trailing slash, and to have this be different from the MEDIA_URL setting (since the same URL cannot be mapped onto two different sets of files).
Это от http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix
Во-вторых, возможно, вы путаете каталоги в своей файловой системе с URL-адресами. Попробуйте использовать абсолютные URL-адреса, а затем уточнить их.
Я просто использую абсолютное именование. Если вы не запускаете сайт по глубокому пути (или даже если это так), я бы бросил .. и выбрал что-то вроде:
<link rel = "stylesheet" type = "text/css" href = "/media/styles.css">
Обычно я делаю свой собственный простой тег Template, потому что Django не предоставляет файлы CSS / JavaScript. Apache делает это, поэтому мой URL-адрес мультимедиа обычно http://static.mysite.com.
ваше приложение / 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
И в моем файле шаблона:
{% load media_url %}
<link href = "{{ media_url }}css/main.css" rel = "stylesheet" type = "text/css">
Вы также можете заставить ваш собственный препроцессор контекста добавлять переменную media_url в каждый шаблон.
Или вы можете просто использовать django.core.context_processors.media, который встроен и делает то же самое.
ааа, я должен был знать! Я так хотел создать свои собственные теги шаблонов, что пропустил этот!
@ Карл Мейер: Лучший ответ на данный момент. Спасибо.
«Django не предоставляет файлы CSS / JavaScript» - что вы подразумеваете под «предоставлением»?
Мне просто нужно было разобраться в этом самому.
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}),
)
файл шаблона:
<link rel = "stylesheet" type = "text/css" href = "/static/css/style.css" />
С файлом, расположенным здесь:
"C:/Server/Projects/project_name/static/css/style.css"
MEDIA_URL и ADMIN_MEDIA_PREFIX; они могут быть такими же. Это просто не лучшая идея.
Верно, потому что одно всегда будет преобладать над другим, и вы в конечном итоге будете обслуживать мультимедийные файлы своего приложения из той же папки, что и мультимедийные файлы администратора. Обычно это не желаемый результат.
почему URL находится в разделе "settings.DEBUG"? он будет работать, если вы не в режиме отладки?
Я использовал его как условное, потому что это не то, что вы хотите включать в производственной среде, и обычно параметр DEBUG включается только при локальной разработке. У вас должен быть настроен рабочий веб-сервер для обслуживания статических файлов, не передавая их Django.
Просто подумал, что быстро вмешаюсь. Хотя все предложения здесь работают отлично, и я действительно использую пример Тая при разработке, как только вы начнете производство, вы можете выбрать обслуживание файлов через обычный Apache или какой-либо другой сервер, который вы используете.
Что я делаю, так это настраиваю поддомен после завершения разработки и заменяю все ссылки на статические носители. Например:
<link rel = "stylesheet" type = "text/css" href = "http://static.mydomain.com/css/style.css" />
Для этого есть две причины. Во-первых, кажется, что Django будет медленнее обрабатывать эти запросы, когда они не нужны. Во-вторых, поскольку большинство браузеров могут загружать файлы одновременно из 3 разных доменов, использование второго поддомена для ваших статических файлов на самом деле ускорит загрузку ваших пользователей.
В Django уже есть контекстный процесс для MEDIA_URL, см. Документация Django.
Он должен быть доступен по умолчанию (если вы не настроили CONTEXT_PROCESSORS и не забыли добавить его) в RequestContext.
Например: <link rel = "stylesheet" type = "text / css" href = "{{MEDIA_URL}} styles.css" /> Вы также можете использовать этот бит, чтобы упростить локальную разработку: docs.djangoproject.com/en/1.0/howto/static-files
Еще нужно добавить, что если у вас есть отдельный медиа-сервер в субдомене / другом домене, вы можете отключить файлы cookie для своего статического носителя. Небольшая экономия на обработке и пропускной способности.
Один вопрос; Вы пробовали загрузить http: // <your-server-probably-localhost> /media/styles.css прямо из браузера?