django 1.5 - Come utilizzare le variabili all'interno dei tag statici


105

Attualmente sto migrando tutti i riferimenti ai file statici nel mio progetto al nuovo tag {% static%} introdotto da django 1.5, ma ho un problema, in alcuni punti utilizzo le variabili per ottenere il contenuto. Con il nuovo tag non posso, c'è un modo per risolverlo?

Codice attuale:

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

Cosa dovrebbe essere (questo non funziona):

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

Risposte:


149

Dovresti essere in grado di concatenare le stringhe con il addfiltro del modello :

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

Quello che stai tentando di fare non funziona con il statictag del modello perché accetta solo una stringa o una variabile:

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

un modo più pulito è impostare {% static%} come variabile dall'inizio dell'html in modo che possiamo usarlo in qualsiasi modo vogliamo.

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

3
Ciò non riesce se si utilizza l'archiviazione s3 con URL firmati, poiché il back-end di archiviazione se non viene richiamato per preparare l'URL per ogni file.
shuckc

2
Questo sembra molto carino in un modello, ma è più un trucco che un modo pulito di usare statico.
Mikael Lindlöf

23

Per quello che vale, penso che questo sia il modo più semplice:

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

Questa è una vecchia domanda e non sono sicuro che questo metodo potesse essere fatto allora, ma ora, in Django 2.0, sembra funzionare bene per me.


4
Confermo che questo metodo funziona in Django 2.0 e, a mio parere, è il modo migliore per risolvere il problema.
Orangft

Per me funziona, ma i documenti vengono forniti con questo avvertimento: "Le stringhe che possono essere convertite in numeri interi verranno sommate, non concatenate"
run_the_race

Non funziona con i nomi di file con hash (ManifestStaticfilesStorage).
run_the_race

@run_the_race che è effettivamente preoccupante. ma poiché sappiamo che il primo argomento non può essere un numero intero, in questo caso dovrebbe essere sicuro. Inoltre, i nomi dei file con hash hanno " str " o " add " definiti?
aliqandil

17

Ho ottenuto questo per funzionare utilizzando una stringa vuota per il percorso statico e quindi utilizzando le mie variabili nella propria sezione, in questo modo:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>

1
questo è super intelligente, ma quello che ha detto @horbor, puoi semplificarlo ancora di più! docs.djangoproject.com/en/1.6/ref/templates/builtins/…
daviddeath

2
Invece di usare una stringa vuota, usa {% get_static_prefix %}.
Martijn Pieters

13

@rounin, puoi almeno usare

{% get_static_prefix %} 

che verrà caricato quando {% load static%}. È solo più naturale di {% static ''%} :)


Questo non funzionerà con cose come ManifestStaticfilesStorage che cambia foo.jsinfoo.8c9a23d.js
Kos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.