133

I'm currently migrating all the static files references in my project to the new {% static %} tag that django 1.5 introduced, but I'm having a problem, in some places I use variables to get the content. With the new tag I can't, is there any way to solve this?

Current code:

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

What it should be (this doesn't work):

<img src="{% static 'assets/flags/{{ request.LANGUAGE_CODE }}.gif' %}" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" />
CastleDweller
  • 8,204
  • 13
  • 49
  • 69

6 Answers6

184

You should be able to concatenate strings with the add template filter:

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

What you are trying to do doesn't work with the static template tag because it takes either a string or a variable only:

{% static "myapp/css/base.css" %}
{% static variable_with_path %}
{% static "myapp/css/base.css" as admin_base_css %}
{% static variable_with_path as varname %}
Barney Szabolcs
  • 11,846
  • 12
  • 66
  • 91
Bernhard Vallant
  • 49,468
  • 20
  • 120
  • 148
  • What if I want to put a variable{{var}} inside static tag? with tag can only accept one var. – Alston May 04 '23 at 08:15
41

For what it's worth, I think this is the easiest way:

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

This is and old question and I'm not sure if this method could be done back then, But now, in Django 2.0 this seems to work fine for me.

aliqandil
  • 1,673
  • 18
  • 28
30

a cleaner way is to set the {% static %} as a variable from the beginning of the html so we can use it in any way we want.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>
cyberpolin
  • 325
  • 3
  • 2
  • 3
    This fails if you are using s3 storage with signed URLs, as the Storage backend if not invoked to prepare the URL for each file. – shuckc Apr 24 '16 at 21:53
  • 2
    This looks very nice in a template but this is more of a hack than a clean way of using static. – Lindlof Oct 07 '16 at 07:29
23

I got this to work by using an empty string for the static path and then using my variables in their own section, like this:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a>
rounin
  • 1,310
  • 10
  • 12
15

@rounin, you can, at least, use

{% get_static_prefix %} 

which will be loaded when you {% load static %}. It's just more natural then {% static '' %} :)

horbor
  • 609
  • 7
  • 13
  • This won't work with things like ManifestStaticfilesStorage that changes `foo.js` into `foo.8c9a23d.js` – Kos Oct 25 '16 at 08:21
0

Just put the variables outside of the tag:

src="{% static 'directory/' %}{{filename}}.{{fileextension}}"

Result: "directory/filename.fileextension"

Example Result: "directory/bird.jpg"

tdy
  • 36,675
  • 19
  • 86
  • 83