Самая важная часть вопроса в теме.
Мне интересно, какой тег лучше всего подходит для этого случая. Более того... Я нашел код, который также использует settings.STATIC_URL
, включенный {{STATIC_URL}}
в шаблоны.
Я немного смущен.
Самая важная часть вопроса в теме.
Мне интересно, какой тег лучше всего подходит для этого случая. Более того... Я нашел код, который также использует settings.STATIC_URL
, включенный {{STATIC_URL}}
в шаблоны.
Я немного смущен.
Встроенный тег static
template "ссылку [s] на статические файлы, сохраненные в STATIC_ROOT
".
staticfiles
contrib app static
тег шаблона "использует сконфигурированное хранилище STATICFILES_STORAGE
для создания полного URL-адреса для данного относительного пути", который "особенно полезно при использовании нелокального хранилища для развертывания файлов".
В встроенной документации тега шаблона static
(связанной выше) есть примечание, в котором говорится использовать тег шаблона staticfiles
contrib app static
", если у вас есть расширенный прецедент, например использование облачной службы для обслуживания статических файлов", и он дает следующий пример:
{% load static from staticfiles %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
Вы можете использовать {% load staticfiles %}
, а не {% load static from staticfiles %}
, если хотите, но последний более явный.
Я не знаю, какая разница должна быть, но я нашел разницу в использовании (используя django 1.9.1, запущенный через apache, wsgi на Python 3.4). В моем приложении у меня есть несколько изображений в ImageFields
в базе данных. Если я использую такой код в своем шаблоне:
<a href="object-{{object.id}}"><img src="{% static object.image %}" height="200px"></a>
тогда, если я использую {% load static %}
, django будет иметь значение TypeError
(Cannot mix str and non-str arguments
). Вероятно, это связано с тем, что object.image
не является строкой, а ImageField
, которая преобразуется в строку на более позднем этапе. Однако, если вы используете {% load staticfiles %}
, такая ошибка не возникает.
К сожалению, я обнаружил эту разницу, потратив часы на отладку проблемы. Мне удалось найти обходное решение для использования первого варианта, а именно добавить метод строкового преобразователя для объекта следующим образом:
#image string
def image_str(self):
return str(self.image)
Надеемся, что это знание будет полезным для кого-то.
Обратитесь к docs, где есть хорошее объяснение.
Фактически тег шаблона {% static %}
знает расположение STATICFILE_STORAGE
Как говорят документы:
{% load static from staticfiles %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" /> The previous example is equal to calling the url method of an instance of STATICFILES_STORAGE with "images/hi.jpg".
Это особенно полезно при использовании не локального хранилища для развертывать файлы, как описано в разделе Обслуживание статических файлов из облака службы или CDN.
Если вы хотите получить статический URL-адрес без его отображения, вы можете используйте несколько другой вызов:
{% load static from staticfiles %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}" alt="Hi!" />
Надеюсь, что это поможет!
{% load staticfiles %}
очень полезно, когда вы используете разные хранилища, такие как S3, а затем конвертируете в URL-адреса S3