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

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

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>

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.


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


13

@rounin, você pode, pelo menos, usar

{% get_static_prefix %} 

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


Isso não funcionará com coisas como ManifestStaticfilesStorage que muda foo.jsparafoo.8c9a23d.js
Kos,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.