django 1.5 - Как использовать переменные внутри статического тега


105

В настоящее время я переношу все ссылки на статические файлы в моем проекте в новый тег {% static%}, который представил django 1.5, но у меня возникла проблема, в некоторых местах я использую переменные для получения содержимого. С новым тегом я не могу, есть ли способ решить эту проблему?

Текущий код:

<img src="{{ STATIC_URL }}/assets/flags/{{ request.LANGUAGE_CODE }}.gif" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />

Что должно быть (не работает):

<img src="{% static 'assets/flags/{{ request.LANGUAGE_CODE }}.gif' %}" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />

Ответы:


150

Вы должны иметь возможность объединять строки с помощью addфильтра шаблона :

{% with 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' as image_static %}
  {% static image_static %}
{% endwith %}

То, что вы пытаетесь сделать, не работает с staticтегом шаблона, потому что он принимает только строку или переменную:

{% static "myapp/css/base.css" %}
{% static variable_with_path %}
{% static "myapp/css/base.css" as admin_base_css %}
{% static variable_with_path as varname %}

24

более чистый способ - установить {% static%} как переменную с начала html, чтобы мы могли использовать ее любым способом.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>

3
Это не сработает, если вы используете хранилище s3 с подписанными URL-адресами, в качестве серверной части хранилища, если не вызывается для подготовки URL-адреса для каждого файла.
shuckc

2
Это выглядит очень красиво в шаблоне, но это скорее хак, чем простой способ использования статики.
Микаэль Линдлоф,

23

Как бы то ни было, я думаю, что это самый простой способ:

<img src="{% static 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' %}" ... >

Это старый вопрос, и я не уверен, можно ли было использовать этот метод тогда, но теперь, в Django 2.0, это, похоже, отлично работает для меня.


4
Подтверждаю, что этот метод работает в Django 2.0 и, на мой взгляд, это лучший способ решить проблему.
Orangft

У меня работает, но в документации есть предупреждение: «Строки, которые можно привести к целым числам, будут суммироваться, а не объединяться»
run_the_race 05

Не работает с хешированными именами файлов (ManifestStaticfilesStorage).
run_the_race 05

@run_the_race, что действительно беспокоит. но поскольку мы знаем, что первый аргумент не может быть целым числом, в этом случае это должно быть безопасно. Кроме того, определены ли имена хешированных файлов " str " или " add "?
aliqandil 06

17

Я заставил это работать, используя пустую строку для статического пути, а затем используя мои переменные в их собственном разделе, например:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>

1
это супер умно, но то, что сказал @horbor, можно упростить еще больше! docs.djangoproject.com/en/1.6/ref/templates/builtins/…
daviddeath

2
Вместо использования пустой строки используйте {% get_static_prefix %}.
Мартейн Питерс

13

@rounin, вы можете хотя бы использовать

{% get_static_prefix %} 

который будет загружен, когда вы {% load static%}. Это просто более естественно, чем {% static ''%} :)


Это не будет работать с такими вещами, как ManifestStaticfilesStorage, который меняется foo.jsнаfoo.8c9a23d.js
Кос,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.