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

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

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>

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.


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>

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


Cela ne fonctionnera pas avec des choses comme ManifestStaticfilesStorage qui se transforme foo.jsenfoo.8c9a23d.js
Kos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.