django 1.5-如何在静态标签内使用变量


105

我目前正在将项目中的所有静态文件引用迁移到django 1.5引入的新{%static%}标记,但是我遇到了问题,在某些地方我使用变量来获取内容。使用新标签,我无法解决此问题?

当前代码:

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

Answers:


149

您应该可以使用add模板过滤器连接字符串:

{% with 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' as image_static %}
  {% static image_static %}
{% endwith %}

您尝试执行的操作不适用于statictemplate标记,因为它仅采用字符串或变量:

{% 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

一种更干净的方法是从html的开头将{%static%}设置为变量,以便我们可以按需要使用它。

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>

3
如果您使用带有签名URL的s3存储,则此操作将失败,因为如果未调用Storage后端来为每个文件准备URL,则将失败。
shuckc '16

2
在模板中,这看起来非常不错,但这更多的是hack,而不是使用静态的干净方法。
MikaelLindlöf'16 -10-7

23

对于它的价值,我认为这是最简单的方法:

<img src="{% static 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' %}" ... >

这是一个老问题,我不确定该方法是否可以在那时完成,但是现在,在Django 2.0中,这似乎对我来说很好。


4
我确认此方法可在Django 2.0中使用,并且我认为这是解决问题的最佳方法。
Orangft

对我
有用

不适用于哈希文件名(ManifestStaticfilesStorage)。
run_the_race

实际上涉及到的@run_the_race。但由于我们知道第一个参数不能为整数,因此在这种情况下应该是安全的。另外,散列文件名是否定义了“ str ”或“ add ”?
aliqandil '19


13

@rounin,至少可以使用

{% get_static_prefix %} 

当您{%加载静态%}时将加载该文件。比{%static''%} :)更自然


这不适用于ManifestStaticfilesStorage之类的东西,它foo.js变成了foo.8c9a23d.js
Kos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.