【问题标题】:Django; adding variable to media files in a custom widget姜戈;在自定义小部件中向媒体文件添加变量
【发布时间】:2012-06-09 19:14:39
【问题描述】:

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

# 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")

感谢您并随时要求澄清。

【问题讨论】:

    标签: javascript jquery django forms django-widget


    【解决方案1】:

    您实际上不能将变量添加到 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 中使用那个全局变量。您显然需要确保您的代码在页面完成渲染后运行,以便变量可用。此外,由于您在这里处理的是全局变量,因此您应该注意自己的名称。

    【讨论】:

    • 谢谢,这是一个非常有帮助的答案。我会试试这个。
    • 这可行,但是,“%s”正在编码为“var”。有什么方法可以防止“编码为”,您知道这适用于您的技术吗?
    • 谢谢,刚刚想通了,打算评论一下。
    【解决方案2】:

    这肯定会奏效:

    $('#search-form .term').bind('input', function(){
     console.log('this actually works');
    });
    
    <form id="search-form">
     <input type="text" class="term" name="Search" value="Search" 
         autocomplete="off" />
     <input type="submit" name="Search" value="Search" />
    </form>
    

    【讨论】:

    • 您能提供更多解释吗?您的代码有什么作用以及它将如何帮助 OP?
    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 2018-02-01
    • 2017-11-09
    • 2021-07-22
    • 1970-01-01
    • 2011-08-28
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多