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

Osc*_*lal 92 django django-templates django-staticfiles

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

当前代码:

<img src="{{ STATIC_URL }}/assets/flags/{{ request.LANGUAGE_CODE }}.gif" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />
Run Code Online (Sandbox Code Playgroud)

它应该是什么(这不起作用):

<img src="{% static 'assets/flags/{{ request.LANGUAGE_CODE }}.gif' %}" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />
Run Code Online (Sandbox Code Playgroud)

Ber*_*ant 135

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

{% with 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' as image_static %}
  {% static image_static %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

您尝试执行的操作不适用于static模板标记,因为它只接受字符串或变量:

{% static "myapp/css/base.css" %}
{% static variable_with_path %}
{% static "myapp/css/base.css" as admin_base_css %}
{% static variable_with_path as varname %}
Run Code Online (Sandbox Code Playgroud)


小智 22

更简洁的方法是将{%static%}设置为从html开头的变量,这样我们就可以以任何我们想要的方式使用它.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用带有签名URL的s3存储,则会失败,如果未调用存储后端以准备每个文件的URL,则会失败. (3认同)
  • 这在模板中看起来非常好,但这更像是一种破解,而不是使用静态的干净方式. (2认同)

ali*_*dil 15

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

<img src="{% static 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' %}" ... >
Run Code Online (Sandbox Code Playgroud)

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

  • 我确认这个方法适用于Django 2.0,在我看来,这是解决问题的最佳方法. (3认同)

rou*_*nin 14

我通过在静态路径中使用空字符串然后在自己的部分中使用我的变量来实现此功能,如下所示:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
Run Code Online (Sandbox Code Playgroud)

  • 不要使用空字符串,而是使用 `{% get_static_prefix %}`。 (4认同)

hor*_*bor 11

@rounin,你至少可以使用

{% get_static_prefix %} 
Run Code Online (Sandbox Code Playgroud)

在{%load static%}时将加载.这比{%static''%}更自然了:)