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

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

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>

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.


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>

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 ''%} :)


Ini tidak akan bekerja dengan hal-hal seperti ManifestStaticfilesStorage yang berubah foo.jsmenjadifoo.8c9a23d.js
Kos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.