2012-06-05 36 views
0

我想創建一個具有一些媒體文件的小部件,並且我希望能夠傳入媒體文件可以訪問的參數。Django;添加變量到自定義小部件中的媒體文件

例如,在animation.js中我有{{my_variable}}。我的問題是,我怎麼能填充{{my_variable}}內「animation.js」在這樣的方式:

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

感謝您,並隨時要求澄清。

回答

4

你實際上不能添加一個變量到JS文件,因爲JS沒有像模板一樣被解析。它是靜態的。您可以在傳遞一個變量的唯一方法是將其包含在模板代碼內聯腳本:

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

然而,Django不甚至使用小窗口代碼模板解析器。默認的渲染方法返回直接準備好的HTML。這不是一個真正的問題。你只需要以不同的方式處理它。

因此,首先,您需要實際上能夠在小部件的實例化中接受變量。你能做到這一點,像這樣:

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

然後,在你render方法,您可以訪問實例變量將其添加到您的輸出:

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) 

最後,在你的JS正是利用全球變量。您顯然需要確保您的代碼在頁面完成渲染後運行,以便該變量可用。另外,因爲你在這裏處理全局變量,所以你應該注意你的名字。

+0

謝謝,這是一個非常有用的答案。我會試試這個。 – zallarak

+0

這可行,但是,「%s」編碼爲「var」。有沒有什麼辦法可以防止「從編碼到」,你知道它適用於你的技術? – zallarak

+1

嘗試'mark_safe'。看到更新後的代碼 –

相關問題