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

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 %}
Bernhard Vallant
fuente
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>
cyberpolin
fuente
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í.

aliqandil
fuente
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
17

Conseguí que esto funcionara usando una cadena vacía para la ruta estática y luego usando mis variables en su propia sección, así:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
rounin
fuente
1
esto es súper inteligente, pero lo que dijo @horbor, ¡puedes simplificarlo aún más! docs.djangoproject.com/en/1.6/ref/templates/builtins/…
daviddeath
2
En lugar de utilizar una cadena vacía, utilice {% get_static_prefix %}.
Martijn Pieters
13

@rounin, puedes, al menos, usar

{% get_static_prefix %} 

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

horbor
fuente
Esto no funcionará con cosas como ManifestStaticfilesStorage que cambia foo.jsafoo.8c9a23d.js
Kos