django 1.5 - Como usar variáveis ​​dentro de tag estática

105

Atualmente estou migrando todas as referências de arquivos estáticos em meu projeto para a nova tag {% static%} que django 1.5 introduziu, mas estou tendo um problema, em alguns lugares eu uso variáveis ​​para obter o conteúdo. Com a nova tag não consigo, tem como resolver isso?

Código atual:

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

O que deveria ser (isso não funciona):

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

Respostas:

149

Você deve ser capaz de concatenar strings com o addfiltro de modelo :

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

O que você está tentando fazer não funciona com a statictag template porque ela leva uma string ou apenas uma variável:

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

uma maneira mais limpa é definir {% static%} como uma variável desde o início do html para que possamos usá-lo da maneira que quisermos.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>
ciberpolina
fonte
3
Isso falhará se você estiver usando o armazenamento s3 com URLs assinados, pois o back-end do armazenamento não é invocado para preparar o URL para cada arquivo.
shuckc
2
Isso parece muito bom em um modelo, mas é mais um hack do que uma maneira limpa de usar estática.
Mikael Lindlöf
23

Pelo que vale a pena, acho que esta é a maneira mais fácil:

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

Esta é uma velha questão e não tenho certeza se esse método poderia ser feito naquela época, mas agora, no Django 2.0, isso parece funcionar bem para mim.

aliqandil
fonte
4
Confirmo que este método funciona no Django 2.0 e, na minha opinião, é a melhor forma de resolver o problema.
Orangft de
Funciona para mim, mas os documentos vêm com este aviso: "Strings que podem ser coagidos para inteiros serão somados, não concatenados"
run_the_race
Não funciona com nomes de arquivo com hash (ManifestStaticfilesStorage).
run_the_race
@run_the_race que é realmente preocupante. mas como sabemos que o primeiro argumento não pode ser um número inteiro, neste caso deve ser seguro. Além disso, os nomes de arquivo com hash têm " str " ou " add " definido?
aliqandil
17

Eu fiz isso funcionar usando uma string vazia para o caminho estático e, em seguida, usando minhas variáveis ​​em sua própria seção, assim:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
rounin
fonte
1
isso é super inteligente, mas o que @horbor disse, você pode simplificar ainda mais! docs.djangoproject.com/en/1.6/ref/templates/builtins/…
daviddeath
2
Em vez de usar uma string vazia, use {% get_static_prefix %}.
Martijn Pieters
13

@rounin, você pode, pelo menos, usar

{% get_static_prefix %} 

que será carregado quando você {% load static%}. É apenas mais natural do que {% static ''%} :)

Horbor
fonte
Isso não funcionará com coisas como ManifestStaticfilesStorage que muda foo.jsparafoo.8c9a23d.js
Kos,