0

いくつかのメディア ファイルを持つウィジェットを作成したいと考えており、メディア ファイルがアクセスできるパラメーターを渡すことができるようにしたいと考えています。

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

ありがとうございます。お気軽に説明をリクエストしてください。

4

2 に答える 2

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 でそのグローバル変数を利用するだけです。変数が使用できるように、ページのレンダリングが完了した後にコードが実行されることを確認する必要があることは明らかです。また、ここではグローバル var を扱っているため、名前の付け方に注意する必要があります。

于 2012-06-05T19:00:35.570 に答える