django 1.5 - Jak używać zmiennych wewnątrz tagu statycznego


105

Obecnie migruję wszystkie odniesienia do plików statycznych w moim projekcie do nowego tagu {% static%} wprowadzonego przez django 1.5, ale mam problem, w niektórych miejscach używam zmiennych, aby uzyskać zawartość. Z nowym tagiem nie mogę, czy jest jakiś sposób na rozwiązanie tego problemu?

Aktualny kod:

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

Co powinno być (to nie działa):

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

Odpowiedzi:


150

Powinieneś być w stanie połączyć ciągi z addfiltrem szablonu :

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

To, co próbujesz zrobić, nie działa ze staticznacznikiem szablonu, ponieważ pobiera ciąg lub tylko zmienną:

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

czystszym sposobem jest ustawienie {% static%} jako zmiennej od początku html, abyśmy mogli używać jej w dowolny sposób.

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

3
To się nie powiedzie, jeśli używasz magazynu s3 z podpisanymi adresami URL, jako zaplecza magazynu, jeśli nie zostanie wywołany w celu przygotowania adresu URL dla każdego pliku.
shuckc

2
Wygląda to bardzo ładnie w szablonie, ale jest to bardziej hack niż czysty sposób użycia statycznego.
Mikael Lindlöf

23

Na ile to warte, myślę, że jest to najłatwiejszy sposób:

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

To jest stare pytanie i nie jestem pewien, czy ta metoda mogłaby zostać wykonana wtedy, ale teraz, w Django 2.0 wydaje mi się, że działa dobrze.


4
Potwierdzam, że ta metoda działa w Django 2.0 i moim zdaniem jest to najlepszy sposób na rozwiązanie problemu.
Orangft,

Działa dla mnie, ale dokumenty zawierają ostrzeżenie: „Ciągi, które można przekształcić w liczby całkowite, będą sumowane, a nie łączone”
run_the_race

Nie działa z zaszyfrowanymi nazwami plików (ManifestStaticfilesStorage).
run_the_race

@run_the_race, który faktycznie dotyczy. ale ponieważ wiemy, że pierwszy argument nie może być liczbą całkowitą, w tym przypadku powinien być bezpieczny. Ponadto, czy zaszyfrowane nazwy plików mają zdefiniowane „ str ” lub „ add ”?
aliqandil


13

@rounin, możesz przynajmniej użyć

{% get_static_prefix %} 

który zostanie załadowany, gdy {% load static%}. Jest to po prostu bardziej naturalne niż {% static ''%} :)


To nie zadziała z takimi rzeczami, jak ManifestStaticfilesStorage, który zmienia się foo.jsnafoo.8c9a23d.js
Kos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.