【问题标题】:django 1.5 - How to use variables inside static tagdjango 1.5 - 如何在静态标签中使用变量
【发布时间】:2013-05-15 09:14:08
【问题描述】:

我目前正在将项目中的所有静态文件引用迁移到 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' %}" />

【问题讨论】:

    标签: django django-templates django-staticfiles


    【解决方案1】:

    您应该能够使用add template filter 连接字符串:

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

    您尝试做的事情不适用于 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 %}
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我确认此方法在 Django 2.0 中有效,并且在我看来,这是解决问题的最佳方法。
      • 对我有用,但文档带有以下警告:“可以强制转换为整数的字符串将被求和,而不是连接”
      • 不适用于散列文件名 (ManifestStaticfilesStorage)。
      • @run_the_race 这实际上是令人担忧的。但是因为我们知道第一个参数不能是整数,所以在这种情况下它应该是安全的。此外,散列文件名是否定义了“str”或“add”?
      • 在 Django 3.2.5 中它仍然是 IMO 的最佳方式。
      【解决方案3】:

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

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

      【讨论】:

      • 如果您使用带有签名 URL 的 s3 存储,则此操作将失败,如果未调用存储后端来为每个文件准备 URL。
      • 这在模板中看起来非常漂亮,但这更像是一种 hack,而不是使用静态的干净方式。
      【解决方案4】:

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

      <a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
      

      【讨论】:

      【解决方案5】:

      @rounin,你至少可以使用

      {% get_static_prefix %} 
      

      将在您 {% load static %} 时加载。它比 {% static '' %} 更自然:)

      【讨论】:

      • 这不适用于将 foo.js 更改为 foo.8c9a23d.js 的 ManifestStaticfilesStorage 之类的东西
      猜你喜欢
      • 2019-04-12
      • 1970-01-01
      • 2015-04-18
      • 2014-01-03
      • 1970-01-01
      • 2017-11-30
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多