如何在handlebars-django模板中引用静态文件

时间:2016-07-09 09:35:18

标签: django templates django-templates handlebars.js django-staticfiles

要点:

我应该如何引用django模板中把手 - 部件中的静态文件?如果我使用verbatim标签,我可以使用把手,但我不能使用django的static标签。

详情

在将应用程序转换为Django时,我遇到了一个使用handelbars.js来呈现ajax-call-results的部分。除其他外,通过" 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 %}方法。

天真的解决方案是将两种技术结合起来,然后用逐字/ endverbatim字面喷洒模板。除了这看起来丑陋,难以理解并且从一开始看似乎是一个坏主意的事实之外,它也不起作用。

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

结果是泪流满面,结果是

   /S的TemplateSyntaxError   无法解析余数:&#39;&#39;路径{%&#39;来自&#39;&#39;路径{%&#39;

有可能在后端生成正确的静态URL,并进行渲染。但是后端不应该知道我们想要在模板中显示什么图像。

只有解决方案可能是使用“亲戚”对后端进行额外调用。字符串(例如path/result.png)到后端,并要求正确的静态链接?这不是很难,但需要额外的电话,但情况并非如此。

那么如何正确引用这些静态文件?

2 个答案:

答案 0 :(得分:3)

您不想描述车把标签和Django标签之间的界限。也许最干净的解决方案是明确声明车把标签:

{{ "handlebars_variable"|handlebars }}

其中filter handlebars定义为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/。您有多种选择:

  • 您可以使用基于this answeradd过滤器和嵌套的with语句(ugh)。
  • 你可以定义一个名为setvar的模板标签,就像这样做here(如果你愿意的话)。
  • 你可以像这样定义一个ad hoc模板标签(也许是不优雅的):

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

答案 1 :(得分:1)

即使django模板不支持任何类型的转义字符,它们也支持templatetag标记,允许您在这种情况下嵌入特殊文本。

假设你没有太多的把手替换,你可以根据需要做这样的事情:

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

但是,如果您要进行大量替换,根据yarthathrock使用自定义过滤器的答案更简洁,从长远来看可能更容易维护。