django 1.5 - Verwendung von Variablen innerhalb eines statischen Tags

105

Ich migriere derzeit alle statischen Dateiverweise in meinem Projekt auf das neue {% static%} -Tag, das von Django 1.5 eingeführt wurde, aber ich habe ein Problem. An einigen Stellen verwende ich Variablen, um den Inhalt abzurufen. Gibt es mit dem neuen Tag, den ich nicht kann, eine Möglichkeit, dies zu lösen?

Aktueller Code:

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

Was es sein sollte (das funktioniert nicht):

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

Antworten:

149

Sie sollten in der Lage sein, Zeichenfolgen mit dem addVorlagenfilter zu verketten :

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

Was Sie versuchen, funktioniert nicht mit dem staticVorlagen-Tag, da entweder eine Zeichenfolge oder nur eine Variable verwendet wird:

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

Eine sauberere Möglichkeit besteht darin, {% static%} vom Anfang des HTML-Codes an als Variable festzulegen, damit wir sie nach Belieben verwenden können.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>
Cyberpolin
quelle
3
Dies schlägt fehl, wenn Sie S3-Speicher mit signierten URLs verwenden, da das Speicher-Backend nicht aufgerufen wird, um die URL für jede Datei vorzubereiten.
shuckc
2
Das sieht in einer Vorlage sehr gut aus, ist aber eher ein Hack als eine saubere Art, statisch zu verwenden.
Mikael Lindlöf
22

Für das, was es wert ist, denke ich, ist dies der einfachste Weg:

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

Dies ist eine alte Frage, und ich bin mir nicht sicher, ob diese Methode damals durchgeführt werden konnte. Aber jetzt, in Django 2.0, scheint dies für mich gut zu funktionieren.

Aliqandil
quelle
4
Ich bestätige, dass diese Methode in Django 2.0 funktioniert, und meiner Meinung nach ist dies der beste Weg, um das Problem zu lösen.
Orangft
Funktioniert für mich, aber die Dokumente enthalten die folgende Warnung: "Zeichenfolgen, die zu ganzen Zahlen gezwungen werden können, werden summiert und nicht verkettet"
run_the_race
Funktioniert nicht mit Hash-Dateinamen (ManifestStaticfilesStorage).
run_the_race
@run_the_race, das tatsächlich betrifft. Da wir jedoch wissen, dass das erste Argument keine Ganzzahl sein kann, sollte es in diesem Fall sicher sein. Haben in Hash-Dateinamen auch " str " oder " add " definiert?
Aliqandil
17

Ich habe dies zum Laufen gebracht, indem ich eine leere Zeichenfolge für den statischen Pfad verwendet und dann meine Variablen in einem eigenen Abschnitt verwendet habe, wie folgt:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
rounin
quelle
1
das ist super clever, aber was @horbor gesagt hat, du kannst es noch mehr vereinfachen! docs.djangoproject.com/de/1.6/ref/templates/builtins/…
Daviddeath
2
Verwenden Sie statt einer leeren Zeichenfolge {% get_static_prefix %}.
Martijn Pieters
13

@rounin können Sie zumindest verwenden

{% get_static_prefix %} 

Dies wird geladen, wenn Sie {% statisch%} laden. Es ist nur natürlicher als {% static ''%} :)

horbor
quelle
Dies funktioniert nicht mit Dingen wie ManifestStaticfilesStorage, die sich foo.jsinfoo.8c9a23d.js
Kos