5

요약 :어떻게 핸들 - 장고 템플릿에 정적 파일을 참조하는

가 어떻게 장고 템플릿의 핸들 부분에 정적 파일을 참조해야합니까? verbatim 태그를 사용하면 핸들 막대를 사용할 수 있지만 장고의 static 태그는 사용할 수 없습니다. 세부

장고에 응용 프로그램을 변환하는 동안

, 나는 아약스 - 통화 결과를 렌더링 handelbars.js을 사용하는 부분을 가로 질러왔다. 비아 등 다른 사람들 사이에서 "Handlebars.js in Django templates"라고 말하면 {% verbatim %} 태그에 대해 알았습니다.

간단한 핸들 바가 이것으로 잘 작동합니다. 내가 수동으로 경로를 설정하면이 잘 작동하는 동안 이제

<img src="path/{{ result }}.png"> 

, 나는 그것이 좋은 방법입니다 장고 믿고 :하지만이 같은 보이는 이미지가 동적으로 결과에 따라 표시됩니다 일부를 가지고 과 같이 정적 파일을 참조 : 사람이 그렇지 않은 문제를 해결하는 진정한 강력한 이유가없는 한

<img src="{% static 'path/file.png' %}"> 

그냥하는 static_url 상수는 권고하지 않습니다 점점 ​​see for instance this blog

그래서, 나는 그것이를 사용하는 것이 가장 좋습니다 생각

{% static %} 방법.

순진한 해결책은 2 가지 기술을 결합하여 문자 그대로 축약 형/내연계로 템플릿을 분사하는 것입니다. 못 생기고, 판독하기 어렵고 처음부터 나쁜 생각처럼 보일뿐 아니라 작동하지 않습니다. 결과는/
가 나머지를 구문 분석 할 수 없습니다에

TemplateSyntaxError 그대로

{% verbatim %} 
    <!-- handlebars --> 
    {% endverbatim %} 
    <img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}"> 
    {% verbatim %} 
    <!-- handlebars --> 
{% endverbatim %} 

이 눈물로 끝나는 ''경로 {% '

'에서 '경로 {%를'

백엔드 쪽에서 올바른 정적 URL을 생성하여 렌더링 할 수 있습니다. 그러나 백엔드는 템플릿에 어떤 이미지를 표시하려고하는지 알고 있어야하지 않습니다.

'관련'문자열 (예 : path/result.png)을 백엔드에 추가로 호출하고 올바른 정적 링크를 요청하는 것이 해결책 일 수 있습니까? 이것은 그리 어렵지는 않지만 추가 통화가 필요합니다.

이렇게 정적 파일을 올바르게 참조하려면 어떻게해야합니까?

+0

링크 된 블로그 게시물의 'STATIC_URL'사용에 대한 인수는 유스 케이스와 관련이없는 것으로 보입니다. 실제로 정적 URL 접두어 만 명시 적으로 원하기 때문에 나는 반대를 주장합니다. 나머지 URL (파일 이름 부분)은 핸들 바 템플릿에 의해 클라이언트 측에서 생성됩니다. 또한'STATIC_URL'을 래핑하는 ['get_static_prefix'] (https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#get-static-prefix) 템플릿 태그가 있음에 유의하십시오. – solarissmoke

+0

동의 할 지 모르겠습니다. json에서 오는 이미지의 가변 부분 (이름 부분)이 필요하고 핸들 바에 의해 파싱됩니다. 하지만 그 이미지는 장고에 의해 정적 파일로 제공됩니다, 그래서 장고 실제로 거기에 갈 것이라고 결정 싶습니다. 내 상황에서 링크 맨 아래에 캐싱 예제가 유효하지 않은 이유는 없습니다.> 캐쉬를 원할 경우 핸들 막대가 그것에 대해 알지 못합니다. 따라서 핸들 바는 정적 파일의 '상대적'부분에 대해서만 알 수 있습니다. 그리고 볼 수있는 한, 블로그의 모든 인수는 관련이 있습니까? – Nanne

+0

그런 다음 JSON에 적절한 정적 URL 생성을 사용하는 것이 중요합니다. 핸들 바 템플릿이 실제 파일 경로 (캐싱/다른 저장소 백엔드/etc가 수정하는 것)가 생성 된 클라이언트 측인지 여부를 확인하는 방법이 표시되지 않습니다. – solarissmoke

답변

2

핸들 막대 태그와 장고 태그 사이의 경계를 지정하고 싶지 않습니다.filterhandlebars이 너무 (source)으로 정의된다

{{ "handlebars_variable"|handlebars }} 

: 아마도 가장 깨끗한 해결책은 명시 적으로 핸들 태그를 선언하는 것입니다

from django import template 
register = template.Library() 

@register.filter 
def handlebars(value): 
    # str.format would require ugly escaping, so we use '%' 
    return '{{%s}}' % value 

그러나 그것은 충분하지 않습니다 : 당신은 핸들을 전달하려면 태그를 static으로 설정하고 필터를 사용하더라도 직접 설정할 수는 없습니다.

{% with "handlebars_variable"|handlebars as handlebars_tag %} 
    <img src="{% static handlebars_tag %}"> 
{% endwith %} 

을하지만, 심지어는 충분하지 :하지만 아마 당신은 with를 사용하여 시도 할 수 있습니다. 앞에 path/을 입력하고 싶습니다. 여러 옵션은 당신을 위해 있습니다

  • 당신은 (우)를 add 필터가 with 문을 this answer을 기반으로 중첩 사용할 수 있습니다.
  • setvar과 같은 템플릿 태그를 정의하여 here (원하는 경우)을 정의 할 수 있습니다.
  • 당신은이 같은 임시 템플릿 태그 (아마도 우아) 정의 할 수 있습니다 :

    @register.filter 
    def static_result_path(value): 
        return 'result/{{%s}}' % value 
    

    를 다음에 템플릿 코드를 변경 : (! 간단한)

    <img src="{% static "handlebars_variable"|static_result_path %}"> 
    
  • 사용 get_static_prefix :

    <img src="{% get_static_prefix %}result/{{ "handlebars_variable"|handlebars }}" /> 
    
  • (항상이 있습니다. 66,003,210.)

+0

정말 좋아 보이지만 어제 일할 수 없습니다. 이것은 주로 디버깅 할 시간이 거의 없었기 때문에 디버깅 시간이 길어서 좋았을 것입니다! – Nanne

+0

흠 무엇이 오류가 생겼습니까? –

+0

그것은 대부분 다른 설정 문제 또는 오타였습니다. 적어도 내가 다루었던 것들은 다음과 같습니다. 나는 Nianticlabs 게임이 나 사이에 왔을 때 이것을 고치 겠지만 당신을 올바르게 표시 할 수 있음을 인정해야합니다. D – Nanne

1

장고 템플릿 이스케이프 문자의 어떤 종류를 지원하지 않더라도, 그들은 당신이이 경우에 특수 문자를 포함 할 수 있습니다 templatetag 태그를 지원하지. 에 따라 사용자 정의 필터를 사용하여,

<img src="{% get_static_prefix %}path/{% templatetag openvariable %} result {% templatetag closevariable %}.png" /> 

그러나 당신이 할 수있는 대체의 많은 경우, :

필요에 따라 그냥 이런 식으로 뭔가를 할 수, 당신은 너무 많은 핸들 대체가없는 가정 yarthathrock의 대답은 더 간결하고 장기적으로 유지하기가 더 쉬울 것입니다.

관련 문제