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 для вашего статического носителя. Сохраняет небольшую обработку и пропускную способность.