2012-06-05 2 views
0

일부 미디어 파일이있는 위젯을 만들고 싶습니다. 미디어 파일이 액세스 할 수있는 매개 변수를 전달할 수 있기를 원합니다.Django; 사용자 정의 위젯의 미디어 파일에 변수 추가

예를 들어 animation.js 내에는 {{my_variable}}이 (가) 있습니다.

# in forms.py 
class myForm(forms.Form): 
    a_field = aCustomWidget(my_variable="#_a_string_variable") 

당신을 감사하고 해명을 요청 주시기 : 제 질문은이 같은 방식으로 {{my_variable}} 내부 'animation.js'을 채울 수있는 방법이다.

답변

4

JS가 템플릿처럼 구문 분석되지 않기 때문에 실제로 변수를 JS 파일에 추가 할 수 없습니다. 그것은 정적입니다. 당신이 변수를 전달할 수있는 유일한 방법은 템플릿 코드에 인라인 스크립트에 포함하는 것입니다 :

<script type="text/javascript"> 
    var my_variable = '{{ my_variable }}`; 
</script> 

그러나, 장고도 위젯 코드에 템플릿 파서를 사용하지 않습니다. 기본 렌더링 메서드는 즉시 사용할 수있는 바로 가기 HTML을 반환합니다. 그것은 정말로 문제가 아닙니다. 다르게 접근해야합니다.

먼저, 위젯의 인스턴스 생성에서 변수를 실제로 받아 들일 수 있어야합니다. 당신과 같이 그 작업을 수행 할 수 있습니다 단지 글로벌을 활용하여 JS에서,

from django.utils.safestring import mark_safe 

... 

def render(self, name, value, attrs): 
    output = super(aCustomWidget, self).render(name, value, attrs) 
    if self.my_variable is not None: 
     output += u'<script type="text/javascript">var my_variable = "%s";</script>' % self.my_variable 
    return mark_safe(output) 

마지막 :

class aCustomWidget(forms.TextInput): 
    def __init__(self, *args, **kwargs): 
     self.my_variable = kwargs.pop('my_variable') 
     super(aCustomWidget, self).__init__(*args, **kwargs) 

그런 다음 render 방법으로, 당신은 당신의 출력에 추가하는 인스턴스 변수에 액세스 할 수 있습니다 변하기 쉬운. 변수를 사용할 수 있도록 페이지가 렌더링 된 후에 코드가 실행되도록해야합니다. 또한 여기서 전역 변수를 다루기 때문에 이름을 무엇인지 명심해야합니다.

+0

감사합니다.이 답변은 대단히 도움이됩니다. 나는 이것을 시도 할 것이다. – zallarak

+0

그러나 "% s"은 & quot; var & quot;로 인코딩됩니다. "인코딩에서"당신의 기술로 그 작품을 알고있는 것을 막을 수있는 방법이 있습니까? – zallarak

+1

'mark_safe'을 시도하십시오. 업데이트 된 코드를보십시오 –

관련 문제