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

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

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>

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.


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>

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


Dies funktioniert nicht mit Dingen wie ManifestStaticfilesStorage, die sich foo.jsinfoo.8c9a23d.js
Kos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.