2011-02-25 3 views
26

jQuery templatesJinja2 템플릿에 삽입하려고합니다. 아아 그들은 둘 다 (기본 설정에서) 표현과 리터럴을 나타 내기 위해 쐐기새 {{ & }}을 각각 사용합니다.jQuery 템플릿이 포함 된 Jinja2의 애매한 콧수염 피하기

나는 다음과 같이 script 태그를 HTML로 내 jQuery를 템플릿을 삽입 해요 : 신사는 문자로 each을 해석하려고하기 때문에

<script type='text/x-jquery-template'> 
    <div>The people are: 
     {{ each people }} 
      ${$value} 
     {{ /each }} 
    </div> 
</script> 

을은 위의 신사 템플릿에있는 경우, 그러나, balks.

상황에 따라 (이미 많은 템플릿이 있음) 변수에 대한 Jinja2의 시작 및 끝 구분 기호를 변경하는 것이 현실적이지 않습니다. 또한 혼란스럽고 상호 운용성이 떨어지며 추가 교육이 필요합니다. 이 옵션을 사용하지 않는 것이 좋습니다.

그래서이 문제를 해결하기 위해 내가 생각했던 두 가지 다른 사항은 다음과 같습니다 탈출

  1. Jinja2 각 '{{'와 '}}', 내가 최선을 다해하는 방법을 아주 잘 모르겠어요있는 ("{{"{{ "}}`, 아마도,하지만 자세한입니다)

  2. 더 실용적인 - 아마도 이상은 - 아마도 jQuery를 확장을 통해, 코드 블록을 구문 분석 하지에 Jinja2를 말하는 것입니다.

나는 의견과 피드백에 대해 감사하게 생각합니다. 읽어 주셔서 감사합니다.

+3

나는 또한 모호한 콧수염을 가지고있다! 면도 할 시간이 왔다는 것을 상기시켜줍니다. :) –

답변

51

{% raw %}{% endraw %} 구조를 사용하면 벗어날 수있는 번거 로움을 덜 수 있습니다 (Jinja2 docs에서 바로).

예 : 고분자 실험 그러나 제안 된 솔루션을 좋아하지 않았다 동안

<script type='text/x-jquery-template'> 
    <div>The people are: 
     {% raw %}<!-- Everything in here will be left untouched by Jinja2 --> 

     {{ each people }} 
      ${$value} 
     {{ /each }} 

     {% endraw %} 
    </div> 
</script> 
+4

이스케이프 및 이스케이프 차단은 훌륭하지만 가장 좋은 방법은 서버 구분 기호가 모두 서버에만 배타적이고 클라이언트 구분 기호가 클라이언트에만 배타적임을 확인하는 것입니다. 따라서 0 탈출이 필요합니다. 사용자 지정 구분 기호를 사용하도록 서버 템플릿 엔진을 구성하면이 작업을 수행 할 수 있습니다. 이렇게하면 이스케이프 처리하지 않아도 서버 및 클라이언트 측 템플릿을 자유롭게 선택할 수 있습니다. 또한 두 엔진 모두 JavaScript 또는 다른 클라이언트 측 코딩과 충돌하지 않아야합니다. – iJames

+0

내가 필요할지 모르겠지만, Handlebars 템플릿 안에 Jinja2 기능을 자유롭게 사용하고 싶습니다. 서버와 클라이언트에서 동일한 언어를 사용할 수 있도록 서버에서 기본 버전을 렌더링 한 다음 동일한 템플릿을 사용하여 클라이언트에서 업데이트 할 수 있도록하려면 반대의 경우에도 매력적일 수 있습니다. –

3

내가 구글을 통해이 발견, 그래서 다른 대안 : 필터를 사용.

#Filter to create curly braces 
@app.template_filter('curly') 
def curly(value): 
    #Handle value as string {{'foo'|curly}} 
    if(isinstance(value,str)): 
     return_value = value 
    #Handle value directly. {{foo|curly}} 
    else: 
     return_value = value._undefined_name 
    return "{{" + return_value + "}}" 

그런 다음 템플릿에서 당신이 {{'foo'|curly}} 또는 {{foo|curly}}

PS를 사용할 수 있습니다 : 당신의 파이썬 코드에서

필터를 정의 당신이 플라스크를 사용하지 않는 경우 난 당신이 사용할 수 없습니다 생각 데코레이터 대신 명시 적으로 필터를 등록해야합니다. environment.filters['curly'] = curly.

+0

저는 오늘 저녁이 문제에 대한 여러 가지 해결책을 모색 해 왔으며 당신의 것이 가장 우아하고 단위 테스트를 위해 Jasmine과 Karma와 잘 어울리는 엄청난 이점이 있습니다. 고맙습니다!! –

관련 문제