django 1.5 - Comment utiliser des variables dans une balise statique

105

Je migre actuellement toutes les références de fichiers statiques de mon projet vers la nouvelle balise {% static%} introduite par django 1.5, mais j'ai un problème, à certains endroits, j'utilise des variables pour obtenir le contenu. Avec la nouvelle balise, je ne peux pas, y a-t-il un moyen de résoudre ce problème?

Code actuel:

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

Ce que cela devrait être (cela ne fonctionne pas):

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

Réponses:

149

Vous devriez pouvoir concaténer des chaînes avec le addfiltre de modèle :

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

Ce que vous essayez de faire ne fonctionne pas avec la staticbalise de modèle car elle ne prend qu'une chaîne ou une 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
la source
24

une manière plus simple est de définir le {% static%} comme une variable depuis le début du html afin que nous puissions l'utiliser comme nous le souhaitons.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>
cyberpoline
la source
3
Cela échoue si vous utilisez le stockage s3 avec des URL signées, car le backend de stockage n'est pas appelé pour préparer l'URL de chaque fichier.
shuckc
2
Cela a l'air très bien dans un modèle, mais c'est plus un hack qu'une manière propre d'utiliser statique.
Mikael Lindlöf
23

Pour ce que ça vaut, je pense que c'est le moyen le plus simple:

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

C'est une vieille question et je ne sais pas si cette méthode pouvait être utilisée à l'époque, mais maintenant, dans Django 2.0, cela semble fonctionner correctement pour moi.

Aliqandil
la source
4
Je confirme que cette méthode fonctionne sous Django 2.0, et à mon avis, c'est la meilleure façon de résoudre le problème.
Orangft
Fonctionne pour moi, mais la documentation est accompagnée de cet avertissement: "Les chaînes qui peuvent être converties en nombres entiers seront additionnées, non concaténées"
run_the_race
Ne fonctionne pas avec les noms de fichiers hachés (ManifestStaticfilesStorage).
run_the_race
@run_the_race qui est en fait préoccupant. mais comme nous savons que le premier argument ne peut pas être un entier, dans ce cas, il devrait être sûr. De plus, les noms de fichiers hachés ont-ils " str " ou " add " définis?
aliqandil le
17

J'ai fait fonctionner cela en utilisant une chaîne vide pour le chemin statique, puis en utilisant mes variables dans leur propre section, comme ceci:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
Rounin
la source
1
c'est super intelligent, mais ce que @horbor a dit, vous pouvez le simplifier encore plus! docs.djangoproject.com/en/1.6/ref/templates/builtins/…
daviddeath
2
Plutôt que d'utiliser une chaîne vide, utilisez {% get_static_prefix %}.
Martijn Pieters
13

@rounin, vous pouvez au moins utiliser

{% get_static_prefix %} 

qui sera chargé lorsque vous {% load static%}. C'est juste plus naturel que {% static ''%} :)

horbor
la source
Cela ne fonctionnera pas avec des choses comme ManifestStaticfilesStorage qui se transforme foo.jsenfoo.8c9a23d.js
Kos