django 1.5-정적 태그 내에서 변수를 사용하는 방법


105

현재 내 프로젝트의 모든 정적 파일 참조를 django 1.5가 도입 한 새로운 {% static %} 태그로 마이그레이션하고 있지만 문제가 있습니다. 어떤 곳에서는 콘텐츠를 가져 오기 위해 변수를 사용합니다. 새 태그로는 할 수 없습니다.이 문제를 해결할 방법이 있습니까?

현재 코드 :

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

그것이 무엇이어야 하는가 (이것은 작동하지 않는다) :

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

답변:


149

add템플릿 필터를 사용하여 문자열을 연결할 수 있어야합니다 .

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

수행하려는 작업 static은 문자열 또는 변수 만 사용하기 때문에 템플릿 태그에서 작동하지 않습니다 .

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

보다 깨끗한 방법은 html 시작 부분에서 {% static %}를 변수로 설정하여 원하는 방식으로 사용할 수 있도록하는 것입니다.

{% load static %}
{% static "" as baseUrl %}
<img src="{{ baseUrl }}/img/{{p.id}}"></img>

3
각 파일에 대한 URL을 준비하기 위해 호출되지 않은 경우 스토리지 백엔드로 서명 된 URL과 함께 s3 스토리지를 사용하는 경우 실패합니다.
shuckc apr

2
이것은 템플릿에서 매우 멋지게 보이지만 정적을 사용하는 깨끗한 방법보다 해킹에 가깝습니다.
Mikael Lindlöf

23

그만한 가치는 이것이 가장 쉬운 방법이라고 생각합니다.

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

이것은 오래된 질문 이며이 방법이 당시에 수행 될 수 있는지 확실하지 않지만 이제 Django 2.0에서는 이것이 잘 작동하는 것 같습니다.


4
이 방법이 Django 2.0에서 작동한다는 것을 확인하고 제 생각에는 문제를 해결하는 가장 좋은 방법입니다.
Orangft

"문자열 연결된하지, 요약 될 정수로 강제 할 수있다"나를 위해 작동하지만 문서는이 경고와 함께
run_the_race

해시 된 파일 이름 (ManifestStaticfilesStorage)에서는 작동하지 않습니다.
run_the_race

실제로 우려되는 @run_the_race. 그러나 우리는 첫 번째 인수가 정수가 될 수 없다는 것을 알고 있기 때문에이 경우 안전해야합니다. 또한 해시 된 파일 이름에 " str "또는 " add "가 정의되어 있습니까?
aliqandil


13

@rounin, 최소한 사용할 수 있습니다.

{% get_static_prefix %} 

{% load static %} 때로드됩니다. {% static ''%}보다 자연 스럽습니다. :)


변경 foo.js되는 ManifestStaticfilesStorage 같은 것들에서는 작동하지 않습니다foo.8c9a23d.js
Kos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.