5

Резюме:Как ссылаться статические файлы в шаблоне рули-Джанго

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

Подробности

При преобразовании приложения в Django, я наткнулся на той части, которая использует handelbars.js для визуализации Ajax-призывного результаты. Via, среди прочих, «Handlebars.js in Django templates« Я узнал о теге {% verbatim %}.

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

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

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

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

Просто получить постоянный static_url не рекомендуется, see for instance this blog

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

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

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

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

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

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

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

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

+0

Аргументы против использования 'STATIC_URL' в сообщении блога, на котором вы ссылаетесь, не кажутся подходящими для вашего прецедента. На самом деле, я бы сказал, наоборот, потому что вы явно хотите только статический URL-префикс. Остальная часть URL-адреса (часть имени файла) создается на стороне клиента с помощью шаблона handlebars. Также обратите внимание, что существует тег шаблона ['get_static_prefix'] (https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#get-static-prefix), который обертывает для вас' STATIC_URL'. – solarissmoke

+0

Я не уверен, что согласен. Я хочу переменную часть изображения (часть имени), которая исходит от json, и обрабатывается ручками. Но этот образ используется как статический файл django, поэтому я хочу, чтобы django решил, что на самом деле будет продолжаться. Нет причин, чтобы пример кэширования в нижней части ссылки недействителен в моей ситуации -> Если я хочу их кэшировать, то рули не будут знать об этом. Таким образом, в конце дескрипторы знали бы только о «относительной» части статического файла, и насколько я вижу, все аргументы в этом блоге актуальны? – Nanne

+0

Затем важно использовать правильное статическое создание URL для JSON? Я не вижу, как это помогает для шаблона дескриптора - фактический путь к файлу (то есть кэширование/другой бэкэнд для хранения/etc) будет сгенерированной клиентской стороной. – solarissmoke

ответ

2

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

{{ "handlebars_variable"|handlebars }} 

где filterhandlebars определяется как так (source):

from django import template 
register = template.Library() 

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

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

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

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

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

    @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.)

+0

Это действительно хорошо выглядит, но я не мог заставить его работать вчера. Это было главным образом из-за небольшого времени для отладки, поэтому я думаю, что это может быть хорошим! – Nanne

+0

Хм, как выглядели ошибки? –

+0

Это были в основном разные проблемы с настройкой или опечатки, по крайней мере, первые, с которыми я имел дело :). Должен признаться, что между нами могла быть какая-то игра Nianticlabs, и исправление этого, но отмечая вас как правильно: D – Nanne

1

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

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

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

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

Смежные вопросы