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' %}" />

Відповіді:


149

Ви повинні мати можливість об'єднати рядки з 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

Не працює з іменами хешованих файлів (ManifestStaticfilesStorage).
run_the_race

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

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 %}.
Martijn Pieters

13

@rounin, ви можете, принаймні, використовувати

{% get_static_prefix %} 

який буде завантажено, коли ви {% завантажуєте статичний%}. Це просто природніше, ніж {% статичний ''%} :)


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