django 1.5 - Cómo usar variables dentro de la etiqueta estática


105

Actualmente estoy migrando todas las referencias de archivos estáticos en mi proyecto a la nueva etiqueta {% static%} que introdujo django 1.5, pero tengo un problema, en algunos lugares utilizo variables para obtener el contenido. Con la nueva etiqueta no puedo, ¿hay alguna forma de solucionar esto?

Código actual:

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

Qué debería ser (esto no funciona):

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

Respuestas:


149

Debería poder concatenar cadenas con el addfiltro de plantilla :

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

Lo que está intentando hacer no funciona con la staticetiqueta de plantilla porque solo toma una cadena o una variable:

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

una forma más limpia es establecer {% static%} como una variable desde el comienzo del html para que podamos usarlo de la forma que queramos.

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

3
Esto falla si está utilizando almacenamiento s3 con URL firmadas, como el backend de almacenamiento si no se invoca para preparar la URL para cada archivo.
shuckc

2
Esto se ve muy bien en una plantilla, pero es más un truco que una forma limpia de usar estática.
Mikael Lindlöf

23

Por lo que vale, creo que esta es la forma más fácil:

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

Esta es una vieja pregunta y no estoy seguro de si este método podría hacerse en ese entonces, pero ahora, en Django 2.0, esto parece funcionar bien para mí.


4
Confirmo que este método funciona en Django 2.0 y, en mi opinión, es la mejor forma de solucionar el problema.
Orangft

Me funciona, pero los documentos vienen con esta advertencia: "Las cadenas que se pueden convertir en números enteros se
sumarán

No funciona con nombres de archivo hash (ManifestStaticfilesStorage).
run_the_race

@run_the_race que es realmente preocupante. pero como sabemos que el primer argumento no puede ser un número entero, en este caso debería ser seguro. Además, ¿los nombres de archivo hash tienen " str " o " add " definidos?
aliqandil


13

@rounin, puedes, al menos, usar

{% get_static_prefix %} 

que se cargará cuando {% load static%}. Es más natural que {% static ''%} :)


Esto no funcionará con cosas como ManifestStaticfilesStorage que cambia foo.jsafoo.8c9a23d.js
Kos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.