如何在 handlebars-django 模板中引用静态文件
How to reference static files in a handlebars-django template
总结:
我应该如何在 django 模板的车把部分中引用静态文件?如果我使用 verbatim
标签,我可以使用车把,但是我不能使用 django 的 static
标签。
详情
在将应用程序转换为 Django 时,我遇到了使用 handelbars.js
呈现 ajax-调用结果的部分。通过“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 %}
方法。
天真的解决方案是将这两种技术结合起来,然后直接用 verbatim/endverbatim 喷洒模板。除了这看起来很难看、难以辨认并且从一开始就不是个好主意之外,它也行不通。
{% verbatim %}
<!-- handlebars -->
{% endverbatim %}
<img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}">
{% verbatim %}
<!-- handlebars -->
{% endverbatim %}
泪流满面,结果是
TemplateSyntaxError at /
Could not parse the remainder: ''path{%' from ''path{%'
有可能在后端生成正确的静态 url 并进行渲染。但是后端应该不知道我们要在模板中显示什么图像。
唯一的解决方案可能是使用 'relative' 字符串(例如 path/result.png
)对后端进行额外调用,并请求正确的静态 link?这并不难,但需要额外的调用,但事实并非如此。
那么如何正确引用这些静态文件呢?
您不想划定 handlebar 标签和 Django 标签之间的界限。也许最干净的解决方案是显式声明车把标签:
{{ "handlebars_variable"|handlebars }}
其中 filter handlebars
is defined as so (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 answer 和嵌套
with
语句的 add
过滤器(呃)。
- 您可以像这样定义一个名为
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。)
即使 django 模板不支持任何类型的转义字符,它们也支持 templatetag 标签,允许您在这种情况下嵌入特殊文本。
假设您没有太多车把替代品,您可以根据需要做这样的事情:
<img src="{% get_static_prefix %}path/{% templatetag openvariable %} result {% templatetag closevariable %}.png" />
但是,如果您有很多替换要做,根据 yartathrock 的回答使用自定义过滤器会更简洁,因此可能更容易维护 运行。
总结:
我应该如何在 django 模板的车把部分中引用静态文件?如果我使用 verbatim
标签,我可以使用车把,但是我不能使用 django 的 static
标签。
详情
在将应用程序转换为 Django 时,我遇到了使用 handelbars.js
呈现 ajax-调用结果的部分。通过“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 %}
方法。
天真的解决方案是将这两种技术结合起来,然后直接用 verbatim/endverbatim 喷洒模板。除了这看起来很难看、难以辨认并且从一开始就不是个好主意之外,它也行不通。
{% verbatim %}
<!-- handlebars -->
{% endverbatim %}
<img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}">
{% verbatim %}
<!-- handlebars -->
{% endverbatim %}
泪流满面,结果是
TemplateSyntaxError at /
Could not parse the remainder: ''path{%' from ''path{%'
有可能在后端生成正确的静态 url 并进行渲染。但是后端应该不知道我们要在模板中显示什么图像。
唯一的解决方案可能是使用 'relative' 字符串(例如 path/result.png
)对后端进行额外调用,并请求正确的静态 link?这并不难,但需要额外的调用,但事实并非如此。
那么如何正确引用这些静态文件呢?
您不想划定 handlebar 标签和 Django 标签之间的界限。也许最干净的解决方案是显式声明车把标签:
{{ "handlebars_variable"|handlebars }}
其中 filter handlebars
is defined as so (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 answer 和嵌套
with
语句的add
过滤器(呃)。 - 您可以像这样定义一个名为
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。)
即使 django 模板不支持任何类型的转义字符,它们也支持 templatetag 标签,允许您在这种情况下嵌入特殊文本。
假设您没有太多车把替代品,您可以根据需要做这样的事情:
<img src="{% get_static_prefix %}path/{% templatetag openvariable %} result {% templatetag closevariable %}.png" />
但是,如果您有很多替换要做,根据 yartathrock 的回答使用自定义过滤器会更简洁,因此可能更容易维护 运行。