Django: как вы обслуживаете медиа/таблицы стилей и ссылаетесь на них в шаблонах?
Были заданы вариации этого вопроса, но я все еще не могу правильно загружать таблицы стилей при рендеринге моих шаблонов.
Я пытаюсь использовать статические носители из процесса 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/, а приложение 3 откроется по адресу www.example.com/application/app3/. Это меня путало, я думаю.
Ответы
Ответ 1
Я просто должен был понять это сам.
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"
Ответ 2
В Django уже есть контекстный процесс для MEDIA_URL, см. Документация Django.
Он должен быть доступен по умолчанию (если вы не настроили CONTEXT_PROCESSORS и не забыли его добавить) в RequestContext.
Ответ 3
Я обычно делаю свой собственный простой шаблон, потому что Django не предоставляет файлы CSS/JavaScript. Apache делает это, поэтому мой медиа-URL обычно 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
И в моем файле шаблона:
{% load media_url %}
<link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css">
Вы также можете сделать свой собственный препроцессор контекста, чтобы добавить переменную media_url в каждый шаблон.
Ответ 4
Я просто использую абсолютное именование. Если вы не запустили сайт на глубоком пути (или даже если есть), я бы сбросил ..
и перешел к чему-то вроде:
<link rel="stylesheet" type="text/css" href="/media/styles.css">
Ответ 5
У меня есть пара идей, я не знаю, кто из них работает для меня:)
Обязательно используйте конечную косую черту и чтобы она отличалась от настройки MEDIA_URL (поскольку один и тот же URL-адрес не может быть отображен на два разных набора файлов).
Что из http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix
Во-вторых, возможно, вы путаете каталоги в своей файловой системе с помощью URL-адресов. Попробуйте использовать абсолютные URL-адреса, а затем уточните их.
Ответ 6
Просто подумал, что я быстро перезвоню. Хотя все предложения здесь работают очень хорошо, и я использую пример Ty при разработке, как только вы нажмете на производство, вы можете захотеть использовать файлы через прямой Apache или любой другой сервер, который вы используете.
То, что я делаю, это настроить субдомен после того, как я закончил разработку, и заменить все ссылки на статические носители. Например:
<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />
Причины для этого в два раза. Во-первых, похоже, что было бы медленнее, если Django обрабатывал эти запросы, когда это не было необходимо. Во-вторых, поскольку большинство браузеров могут фактически загружать файлы одновременно из трех разных доменов, использование второго поддомена для ваших статических файлов фактически ускорит скорость загрузки ваших пользователей.
Ответ 7
Еще одна вещь, которую нужно добавить, заключается в том, что если у вас есть отдельный медиа-сервер в субдомене/другом домене, вы можете отключить файлы cookie для вашего статического носителя. Сохраняет небольшую обработку и пропускную способность.