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 ''%} :)

Horbor
источник
Это не будет работать с такими вещами, как ManifestStaticfilesStorage, который меняется foo.jsнаfoo.8c9a23d.js
Кос,