В чем разница между {% load staticfiles%} и {% load static%}

Самая важная часть вопроса в теме.

Мне интересно, какой тег лучше всего подходит для этого случая. Более того... Я нашел код, который также использует settings.STATIC_URL, включенный {{STATIC_URL}} в шаблоны.

Я немного смущен.

Ответ 1

Встроенный тег 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 %}, если хотите, но последний более явный.

Ответ 2

Я не знаю, какая разница должна быть, но я нашел разницу в использовании (используя 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)

Надеемся, что это знание будет полезным для кого-то.

Ответ 3

Обратитесь к 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!" />

Надеюсь, что это поможет!

Ответ 4

{% load staticfiles %} очень полезно, когда вы используете разные хранилища, такие как S3, а затем конвертируете в URL-адреса S3