STATIC_URL не работает
Я пытаюсь вытащить средства массовой информации для своих шаблонов, используя переменную STATIC_URL. Например, у меня есть этот код
{% extends "admin/change_list.html" %}
{% load i18n %}
{% block extrahead %}
<!--[if IE]>
<script type="text/javascript" src="{% firstof STATIC_URL MEDIA_URL %}django_qbe/js/excanvas.js"></script>
<![endif]-->
<script type="text/javascript" src="{% firstof STATIC_URL MEDIA_URL %}django_qbe/js/jquery.js"></script>
Каждый раз, когда загружается шаблон, он пытается вывести MEDIA_URL. Если я изменю его на
{% extends "admin/change_list.html" %}
{% load i18n %}
{% load static %}
{% block extrahead %}
<!--[if IE]>
<script type="text/javascript" src="{% get_static_prefix %}django_qbe/js/excanvas.js"></script>
<![endif]-->
<script type="text/javascript" src="{% get_static_prefix %}django_qbe/js/jquery.js"></script>
Мой вопрос: почему моя первая версия этого шаблона не работает?
Ответы
Ответ 1
Существует статический контекстный процессор который не совпадает с media
. Вы должны убедиться, что у вас есть django.core.context_processors.static
в вашем списке контекстных процессоров, поэтому он может добавить STATIC_URL
в контекст.
Ответ 2
Из документов:
Если {{STATIC_URL}} не работает в вашем шаблоне, вы, вероятно, не используете RequestContext при рендеринге шаблона.
https://docs.djangoproject.com/en/dev/howto/static-files/
Ответ 3
Большинство вещей уже упоминалось, но для компиляции и добавления немного:
-
Убедитесь, что ваш файл settings.py правильно указывает расположение ваших статических файлов. Как писал Стивен Кит, вы должны иметь что-то вроде:
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/static/admin/'
import os
# Additional locations of static files
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), 'static'),
)
-
Затем убедитесь, что ваш TEMPLATE_CONTEXT_PROCESSORS включает 'django.core.context_processors.static'. Если в параметрах settings.py нет записи для TEMPLATE_CONTEXT_PROCESSORS, то по умолчанию она будет ниже, и вы все хорошо.
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
)
-
Убедитесь, что вы используете RequestContext при визуализации своих шаблонов. django.shortcuts.render
делает это по умолчанию (см. здесь), поэтому вы можете просто позвонить
from django.shortcuts import render
def myViewFunction(request):
return render(request, 'myTemplate.html')
Будьте осторожны, поскольку django.shortcuts.render_to_response не делает этого для вас, если вы не добавите аргумент, поэтому вам нужно написать что-то вроде
from django.shortcuts import render_to_response
def myViewFunction(request):
return render_to_response('myTemplate.html', myContext, context_instance=RequestContext(request))
Ответ 4
Для меня ответ был просто прекратить использование STATIC_URL и вместо этого использовать следующее:
Я изменил свою версию из
<link href="{{ STATIC_URL }}css/survey.less" media="screen" rel="stylesheet" type="text/css"/>
в
<link href="{% static "css/style.less" %}" media="screen" rel="stylesheet" type="text/less"/>
И теперь это прекрасно работает. Гораздо проще, и я подозреваю, что это также немного "более правильный" способ использовать статику сейчас (по Django 1.4). Дополнительную информацию об особенностях см. В Django docs.
Не забудьте добавить {% load static from staticfiles %}
вверху ваших шаблонов, которые тоже используют его.
Ответ 5
Поскольку меня обвиняют в том, что я не ответил на этот вопрос, позвольте мне пояснить мне мыслительный процесс:
My question is why doesn't my first version of this template work?
STATIC_URL is returning a False value
Чтобы определить, почему, выполните следующие действия:
-
Попробуйте распечатать его в своем шаблоне - {{STATIC_URL}}.
-
Проверьте settings.py, чтобы убедиться, что значение установлено - STATIC_URL = '/static/'
Проверьте, правильно ли установлены файлы STATIC на сервере задач:
https://docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/
Для справки я использую:
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/static/admin/'
# Additional locations of static files
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, 'static'),
)
или псевдоним Apache:
Alias /static /Users/stevenkeith/foo/bar/static
<Directory /Users/stevenkeith/foo/bar/static>
Order deny,allow
Allow from all
</Directory>
или любой другой метод, который вы хотите, nginx и т.д.