django 1.5 - Bagaimana menggunakan variabel di dalam tag statis

105

Saat ini saya memigrasi semua referensi file statis dalam proyek saya ke tag {% static%} baru yang diperkenalkan django 1.5, tetapi saya mengalami masalah, di beberapa tempat saya menggunakan variabel untuk mendapatkan konten. Dengan tag baru saya tidak bisa, adakah cara untuk mengatasi ini?

Kode saat ini:

<img src="{{ STATIC_URL }}/assets/flags/{{ request.LANGUAGE_CODE }}.gif" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />

Apa yang seharusnya (ini tidak berhasil):

<img src="{% static 'assets/flags/{{ request.LANGUAGE_CODE }}.gif' %}" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />
Oscar Carballal
sumber

Jawaban:

149

Anda harus dapat menggabungkan string dengan addfilter template :

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

Apa yang Anda coba lakukan tidak berfungsi dengan statictag template karena hanya mengambil string atau variabel:

{% static "myapp/css/base.css" %}
{% static variable_with_path %}
{% static "myapp/css/base.css" as admin_base_css %}
{% static variable_with_path as varname %}
Bernhard Vallant
sumber
24

cara yang lebih bersih adalah dengan menyetel {% static%} sebagai variabel dari awal html sehingga kita dapat menggunakannya dengan cara apapun yang kita inginkan.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>
cyberpolin.dll
sumber
3
Ini gagal jika Anda menggunakan penyimpanan s3 dengan URL yang ditandatangani, sebagai penyimpanan backend jika tidak dipanggil untuk menyiapkan URL untuk setiap file.
shuckc
2
Ini terlihat sangat bagus di template tetapi ini lebih merupakan retasan daripada cara bersih menggunakan statis.
Mikael Lindlöf
23

Untuk apa nilainya, saya pikir ini adalah cara termudah:

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

Ini dan pertanyaan lama dan saya tidak yakin apakah metode ini bisa dilakukan dulu, Tapi sekarang, di Django 2.0 ini tampaknya bekerja dengan baik untuk saya.

aliqandil
sumber
4
Saya mengkonfirmasi bahwa metode ini bekerja pada Django 2.0, dan menurut pendapat saya, ini adalah cara terbaik untuk menyelesaikan masalah.
Orangft
Berfungsi untuk saya, tetapi dokumen dilengkapi dengan peringatan ini: "String yang dapat dipaksakan menjadi bilangan bulat akan dijumlahkan, bukan digabungkan"
run_the_race
Tidak berfungsi dengan nama file berciri (ManifestStaticfilesStorage).
run_the_race
@run_the_race yang sebenarnya mengkhawatirkan. tapi karena kita tahu argumen pertama tidak boleh bilangan bulat, dalam hal ini seharusnya aman. Juga, apakah nama file yang di-hash memiliki definisi " str " atau " add "?
aliqandil
17

Saya membuat ini bekerja dengan menggunakan string kosong untuk jalur statis dan kemudian menggunakan variabel saya di bagiannya sendiri, seperti ini:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
rounin
sumber
1
ini sangat pintar, tetapi apa yang dikatakan @horbor, Anda dapat lebih menyederhanakannya! docs.djangoproject.com/en/1.6/ref/templates/builtins/...
daviddeath
2
Daripada menggunakan string kosong, gunakan {% get_static_prefix %}.
Martijn Pieters
13

@rounin, setidaknya Anda bisa menggunakan

{% get_static_prefix %} 

yang akan dimuat saat Anda {% load static%}. Itu lebih alami daripada {% static ''%} :)

horbor
sumber
Ini tidak akan bekerja dengan hal-hal seperti ManifestStaticfilesStorage yang berubah foo.jsmenjadifoo.8c9a23d.js
Kos