Django的;将变量添加到自定义小部件中的媒体文件

时间:2012-06-05 18:37:31

标签: javascript jquery django forms django-widget

我想制作一个包含一些媒体文件的小部件,我希望能够传入媒体文件可以访问的参数。

# in forms.py
class aCustomWidget(forms.TextInput):
    class Media:
        css = {
            'all': ('pretty.css',)
        }
        js = ('animations.js',)

例如,在animation.js中我有{{my_variable}}。我的问题是,如何以这样的方式在'animation.js'中填充{{my_variable}}:

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

感谢您,并随时要求澄清。

1 个答案:

答案 0 :(得分: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中只使用那个全局变量。显然,您需要确保在页面完成渲染后运行代码,以便变量可用。此外,既然你在这里处理全局变量,你应该注意你的名字。