Как ссылаться на статические файлы в шаблоне handlebars-django

Резюме:

Как мне ссылаться на статические файлы в части руля в шаблоне django? Я могу использовать руль, если использую теги verbatim, но тогда я не могу использовать тег static django.

Подробности

При преобразовании приложения в Django я наткнулся на часть, которая использует handelbars.js для рендеринга результатов вызова ajax. Через, среди прочего, «Handlebars.js в шаблонах Django» я узнал о {% verbatim %} тег.

С этим отлично подойдет простой руль. Но у меня также есть часть, в которой изображения динамически отображаются в зависимости от результата, который выглядит примерно так:

<img src="path/{{ result }}.png">

Теперь, хотя это нормально работает, если я задаю путь вручную, я считаю, что в Django рекомендуется ссылаться на ваши статические файлы следующим образом:

<img src="{% static 'path/file.png' %}">

Не рекомендуется просто получать константу static_url, см., Например, этот блог

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

Наивным решением было бы объединить две техники и буквально окрасить шаблон дословно / окончательно. Помимо того, что это выглядит некрасиво, неразборчиво и с самого начала кажется плохой идеей, это еще и не работает.

{% verbatim %}
    <!-- handlebars -->
    {% endverbatim %}
    <img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}">
    {% verbatim %}
    <!-- handlebars -->
{% endverbatim %}

Это заканчивается слезами, потому что в результате

TemplateSyntaxError в /
Не удалось проанализировать остаток: '' путь {% 'от' 'путь {%'

Возможно, удастся сгенерировать правильный статический URL-адрес на стороне бэкенда и отобразить его. Но бэкэнд не должен знать, какое изображение мы хотим показать в шаблоне.

Единственным решением может быть дополнительный вызов бэкэнда с «относительной» строкой (например, path/result.png) в бэкэнд и запросить правильную статическую ссылку? Это не так сложно, но требует дополнительного вызова, чего не должно быть.

Итак, как мне правильно ссылаться на эти статические файлы?


person Nanne    schedule 09.07.2016    source источник
comment
Аргументы против использования STATIC_URL в сообщении блога, на которое вы ссылаетесь, не кажутся имеющими отношение к вашему варианту использования. Фактически, я бы сказал обратное, потому что вам явно нужен только статический префикс URL. Остальная часть URL-адреса (часть имени файла) создается на стороне клиента с помощью вашего шаблона ручек. Также обратите внимание, что существует get_static_prefix тег шаблона, который содержит STATIC_URL для вас.   -  person solarissmoke    schedule 09.07.2016
comment
Я не уверен, что согласен. Мне нужна переменная часть изображения (часть имени), которая поступает из json и анализируется ручками. Но это изображение используется django как статический файл, поэтому я хочу, чтобы django решал, что на самом деле там будет происходить. Нет причин, по которым пример кеширования внизу ссылки недействителен в моей ситуации - ›Если я хочу кэшировать их, то handlebars не узнает об этом. Так что, в конце концов, handlebars будет знать только об «относительной» части статического файла, и, насколько я могу судить, все аргументы в этом блоге актуальны?   -  person Nanne    schedule 09.07.2016
comment
Тогда важно использовать правильную генерацию статических URL-адресов для JSON? Я не понимаю, как это помогает шаблону руля, если фактический путь к файлу (который изменит кеширование / другое хранилище и т. Д.) Является сгенерированной клиентской стороной.   -  person solarissmoke    schedule 09.07.2016
comment
Таким образом, это будет означать создание полной ссылки в JSON, чего я бы предпочел не делать, поскольку модели не обязаны знать об этих изображениях ...   -  person Nanne    schedule 09.07.2016
comment
Насколько распространен ваш код руля? Если есть совсем немного, вы можете использовать templatetag тег для его кодирования ...   -  person Peter Brittain    schedule 15.07.2016
comment
Это довольно много, но для некоторых это звучит как работоспособное решение? Может быть, вставьте его в ответ и добавьте небольшой пример, он звучит неплохо ...   -  person Nanne    schedule 15.07.2016


Ответы (2)


Вы не хотите проводить границу между тегами руля и тегами Django. Возможно, самым чистым решением будет явное объявление тегов руля следующим образом:

{{ "handlebars_variable"|handlebars }}

где фильтр handlebars определяется следующим образом (источник):

from django import template
register = template.Library()

@register.filter
def handlebars(value):
    # str.format would require ugly escaping, so we use '%'
    return '{{%s}}' % value

Но этого недостаточно: вы хотите передать тег handlebars в static, и даже с фильтром вы не можете сделать это напрямую. Но, возможно, вы могли бы попробовать использовать с:

{% with "handlebars_variable"|handlebars as handlebars_tag %}
  <img src="{% static handlebars_tag %}">
{% endwith %}

Но даже этого недостаточно. Вы хотите добавить path/. У вас есть несколько вариантов:

  • Вы можете использовать фильтр add на основе этого ответа и вложенных операторов with (тьфу).
  • Вы можете определить тег шаблона с именем setvar, как это сделано, здесь (если хотите).
  • Вы можете определить специальный тег шаблона следующим образом (возможно, неэлегантный):

    @register.filter
    def static_result_path(value):
        return 'result/{{%s}}' % value   
    

    а затем измените код шаблона на:

    <img src="{% static "handlebars_variable"|static_result_path %}">
    
  • Используйте get_static_prefix (самый простой!) :

    <img src="{% get_static_prefix %}result/{{ "handlebars_variable"|handlebars }}" />
    
  • (И всегда есть Jinja.)

person Yatharth Agarwal    schedule 14.07.2016
comment
Он действительно выглядит неплохо, но вчера я не смог заставить его работать. В основном это произошло из-за небольшого количества времени на отладку, поэтому я думаю, что это может быть неплохо! - person Nanne; 15.07.2016
comment
В основном это были разные проблемы с настройкой или опечатки, по крайней мере, первые, с которыми я имел дело :). Я должен признать, что могла быть какая-то игра Nianticlabs, которая помешала мне исправить это, но пометила вас как правильного: D - person Nanne; 18.07.2016

Несмотря на то, что шаблоны django не поддерживают никаких escape-символов, они поддерживают templatetag, позволяющий в этом случае вставить специальный текст.

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

<img src="{% get_static_prefix %}path/{% templatetag openvariable %} result {% templatetag closevariable %}.png" />

Однако, если вам нужно сделать много замен, использование настраиваемого фильтра в соответствии с ответом yarthathrock более лаконично и, вероятно, его будет легче поддерживать в долгосрочной перспективе.

person Peter Brittain    schedule 16.07.2016