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' %}" />
Oscar Carballal
źródło

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 %}
Bernhard Vallant
źródło
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>
cyberpolin
źródło
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.

aliqandil
źródło
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
17

Mam to do pracy, używając pustego ciągu dla ścieżki statycznej, a następnie używając moich zmiennych w ich własnej sekcji, na przykład:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
rounin
źródło
1
to jest super sprytne, ale co powiedział @horbor, możesz to jeszcze bardziej uprościć! docs.djangoproject.com/en/1.6/ref/templates/builtins/ ...
daviddeath
2
Zamiast używać pustego ciągu, użyj {% get_static_prefix %}.
Martijn Pieters
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 ''%} :)

Horbor
źródło
To nie zadziała z takimi rzeczami, jak ManifestStaticfilesStorage, który zmienia się foo.jsnafoo.8c9a23d.js
Kos