Django: как вы обслуживаете медиа / таблицы стилей и ссылаетесь на них в шаблонах - PullRequest
43 голосов
/ 15 января 2009

Заданы варианты этого вопроса, но я все еще не могу правильно загрузить таблицы стилей при визуализации моих шаблонов.

Я пытаюсь обслуживать статический носитель из процесса 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>

Уверяю вас, файлы (templates / media) находятся в правильном каталоге в моей файловой системе. Если есть какая-либо дополнительная информация, которую я должен предоставить, пожалуйста, оставьте комментарий.


Редактировать:

Одной из проблем, с которыми я столкнулся, было использование «/» для добавления моих ссылок. Если перед ним стоит косая черта, ссылка открывается из корня сайта. Если косой черты нет, ссылка открывается на текущем уровне. Пример:

www.example.com / application / имеет ссылку "/ app2 / и ссылку" app3 /".
app2 откроется на www.example.com/app2/, а app3 откроется на www.example.com/application/app3/. Я думаю, это меня смутило.

Ответы [ 7 ]

51 голосов
/ 15 января 2009

Я просто должен был понять это сам.

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"
11 голосов
/ 26 января 2009

У Django уже есть контекстный процесс для MEDIA_URL, см. Документация Django .

Это должно быть доступно по умолчанию (если вы не настроили CONTEXT_PROCESSORS и не забыли добавить его) в RequestContext.

6 голосов
/ 15 января 2009

Я обычно делаю свой собственный простой шаблонный тег, потому что Django не предоставляет файлы CSS / JavaScript. Apache делает это так, что мой медиа-адрес обычно 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 в каждый шаблон.

2 голосов
/ 15 января 2009

Я просто использую абсолютное наименование. Если вы не ведете сайт по глубокому пути (или даже если вы это делаете), я бы опустил .. и пошел бы что-то вроде:

<link rel="stylesheet" type="text/css" href="/media/styles.css">
1 голос
/ 20 января 2009

Просто подумал, что я быстро войду. Несмотря на то, что все предложения здесь работают просто отлично, и я использую пример Тая при разработке, после того, как вы приступите к работе, вы можете захотеть обслуживать файлы через простой Apache или любой другой сервер, который вы используете.

Что я делаю, так это настраиваю поддомен после завершения разработки и заменяю все ссылки на статические носители. Например:

<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />

Причины этого двоякие. Во-первых, кажется, что Django будет обрабатывать эти запросы медленнее, когда в этом нет необходимости. Во-вторых, поскольку большинство браузеров могут одновременно загружать файлы из 3 разных доменов, использование второго субдомена для статических файлов на самом деле ускорит скорость загрузки ваших пользователей.

1 голос
/ 15 января 2009

У меня есть пара идей, я не знаю, какая из них работает для меня:)

Убедитесь, что используется конечная косая черта, и она должна отличаться от настройки MEDIA_URL (поскольку один и тот же URL не может быть сопоставлен с двумя разными наборами файлов).

Это от http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix

Во-вторых, возможно, вы путаете каталоги в своей файловой системе с путями URL. Попробуйте использовать абсолютные URL-адреса, а затем уточните их.

0 голосов
/ 10 августа 2010

Еще одна вещь, которую нужно добавить, это то, что если у вас есть отдельный медиасервер в поддомене / другом домене, вы можете отключить куки для вашего статического носителя. Экономит немного времени на обработку и пропускную способность.

...