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

回答:


149

addテンプレートフィルターで文字列を連結できるはずです。

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

24

よりきれいな方法は、HTMLの最初から{%static%}を変数として設定して、好きなように使用できるようにすることです。

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

3
各ファイルのURLを準備するために呼び出されない場合、ストレージバックエンドとして、署名付きURLでs3ストレージを使用している場合、これは失敗します。
shuckc

2
これはテンプレートで非常に見栄えが良いですが、これはstaticを使用するきれいな方法というよりはハックです。
MikaelLindlöf2016年

23

それが価値があるもののために、私はこれが最も簡単な方法だと思います:

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

これは古い質問であり、この方法がその当時に実行できるかどうかはわかりませんが、現在、Django 2.0では、これでうまくいくようです。


4
この方法がDjango 2.0で機能することを確認しました。私の意見では、これは問題を解決する最良の方法です。
オランフト

私には機能しますが、ドキュメントには次の警告が付いています:「整数に強制
変換

ハッシュされたファイル名(ManifestStaticfilesStorage)では機能しません。
run_the_race

@run_the_raceは実際に懸念しています。しかし、最初の引数は整数にできないことを知っているので、この場合は安全です。また、ハッシュされたファイル名には「str」または「add」が定義されていますか?
アリカンジル

17

静的パスに空の文字列を使用し、独自のセクションで次のように変数を使用してこれを機能させました:

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

1
これはとても賢いですが、@ horborが言ったことは、もっと簡単にできることです!docs.djangoproject.com/en/1.6/ref/templates/builtins/...
daviddeath

2
空の文字列を使用するのではなく、を使用してください{% get_static_prefix %}
Martijn Pieters

13

@rounin、少なくとも、使用できます

{% get_static_prefix %} 

{%load static%}をロードするとロードされます。それは{%static ''%}よりも自然です:)


これは、次のように変化foo.jsするManifestStaticfilesStorageなどでは機能しませんfoo.8c9a23d.js
Kos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.