2013-02-06 5 views
1

나는 이것을 알아 내지 못합니다. {{variable}}을 사용하여 변수를 렌더링하는 Python/Django 템플릿이 있는데 사용자가 버튼을 클릭 할 때 변수를 조작하기 위해 HTML 페이지에서 Javascript를 사용하려고합니다.자바 스크립트에서 변수에 이중 중괄호를 연결하는 방법

내가보기에 문제는 자바가 {{다르게, HTML로 렌더링 할 때 변수를 변환하지 않는다는 것입니다. (즉, 변수 대신 {+ id +}가 코드 아래 : (그것은 5 'ID를'변환 예.) "{{"와 그 작동하는 것 같다하지만 파이썬은 같은 문자열을 해석하지 않습니다

function changeDate() 
    id = 5; 
    html = "{{ variable[" + id + "] }}"; 
    document.getElementById('test').innerHTML = html; 

나는이처럼 그들을 탈출 시도했습니다 변수의 실제 값 대신 페이지의 문자열을 {{variable [5]}}로 표시합니다.

입니다. 는 JavaScript가 이후에 DAB를 이후에 이미 렌더링했기 때문에 발생합니다. 따라서 Python은 처음에 페이지를 렌더링 할 때 변수를 변환 할 수있는 기회가 없습니다.

그래서 나는 두 가지 해결책이 있다고 생각 :

  1. 그림 밖으로 문자열의 {{와}} 떠나 제대로하면서 변수를 렌더링 할 수있는 방법이

또는

  1. Python이 {{variable [5]}의 문자열 버전을 자바 스크립트를 통해 표시되기 전에 해석하도록하는 방법을 알아 봅니다.

도움을 주시면 감사하겠습니다.

+0

서버 측 코드는 JS 변수를 알지 못합니다. 모든 JS 코드와 html은 그대로 응답에 포함됩니다. 브라우저가 응답을 받기 전에 모든 서버 측 코드가 실행됩니다. – nnnnnn

+0

그래서 ... 자바 스크립트 함수가 있고 장고 템플릿을 사용하여 HTML을 렌더링하고 싶습니까?난 당신이 클라이언트 - 서버 관계의 성격을 오해하고 있다고 생각 ... – nneonneo

+0

@nnnnnn 의견 # 2 (변수를 렌더링하는 파이썬을 받고)하지만 # 1 - 왜 자바 스크립트 변수를 렌더링 할 수 없습니다 중괄호? 그렇지 않으면 당신은 이미 내 질문에서 말한 것을 되풀이했다. –

답변

2

장고의 템플릿 렌더링은 대체 검색을 수행합니다 : 중괄호 안의 문자열을 가져 와서 해당 문자열을 키 int로 사용합니다. 사전이 전달됩니다.

사전 값을 데이터 구조로 액세스하려고 시도하지 않고 단순히 문자열 표현 만 사용합니다.

그래서,

data = {"variable": ["a", "b", "c"] } 

그는 "변수"이름을 기호와 dtemplate 내부 검색 할 수 있습니다 -하지만 당신은 "변수 [0]"에 접근을 시도하면 렌더링 템플릿이 나가서 설명하자면 NameError를 제기한다 - 단순히 때문에 "변수를 [0] "은 (는) 위의 데이터 사전에있는 키가 아닙니다. 그것을 다루는

한 가지 방법은, 자바 스크립트 코드에 색인 부분을 연기 클라이언트에서, 데이터 사전에있는 객체의 자바 스크립트 코드 (JSON) 문자열을 전달하는 것입니다 - 그래서 당신은 따라 뭔가 할 것 :

import json 

function changeDate() 
    id = 5 
    variable = ["bla", "ble", "bli", "blo", "blu", "blew"] 
    html = """<script> id = {{id}}; 
      document.write({{variable}}[id]); 
      </script> 
      """ 
    data = {"variable": json.dumps(variable), "id": id}; 

이 데이터를 html 템플릿으로 렌더링되도록 전달합니다.

+0

감사합니다 @jsbueno, 나는 python 변수를 사용하여 var 변수 = ({{variable [5]}). split (","); 처음에는 Javascript에서 목록 값을 참조하고 싶었습니다. 그래서 트릭은 전체 목록을 자바 스크립트에 배열로 전달한 다음이를 사용했습니다. 감사! –

관련 문제