Django テンプレート レンダラーを使用してページをレンダリングするとき、さまざまな値を含むディクショナリ変数を渡して、{{ myVar }}
.
Javascriptで同じ変数にアクセスする方法はありますか(おそらくDOMを使用して、Djangoが変数にアクセスできるようにする方法がわかりません)? 渡された変数に含まれる値に基づいて、AJAX ルックアップを使用して詳細をルックアップできるようにしたいと考えています。
Django テンプレート レンダラーを使用してページをレンダリングするとき、さまざまな値を含むディクショナリ変数を渡して、{{ myVar }}
.
Javascriptで同じ変数にアクセスする方法はありますか(おそらくDOMを使用して、Djangoが変数にアクセスできるようにする方法がわかりません)? 渡された変数に含まれる値に基づいて、AJAX ルックアップを使用して詳細をルックアップできるようにしたいと考えています。
は{{variable}}
HTML に直接代入されます。ソースを表示します。「変数」などではありません。レンダリングされたテキストです。
そうは言っても、この種の置換を JavaScript に入れることができます。
<script type="text/javascript">
var a = "{{someDjangoVariable}}";
</script>
これにより、「動的」な JavaScript が得られます。
注意チケット#17419をチェックして、同様のタグを Django コアに追加する方法と、ユーザーが生成したデータでこのテンプレート タグを使用することによって導入される可能性のある XSS 脆弱性に関する議論を確認してください。amacneil からのコメントでは、チケットで提起された懸念のほとんどについて説明しています。
これを行う最も柔軟で便利な方法は、JS コードで使用する変数のテンプレート フィルターを定義することだと思います。これにより、データが適切にエスケープされ、 や などの複雑なデータ構造で使用できるようにdict
なりlist
ます。そのため、多くの賛成票で受け入れられた回答があるにもかかわらず、この回答を書いています。
テンプレート フィルターの例を次に示します。
// myapp/templatetags/js.py
from django.utils.safestring import mark_safe
from django.template import Library
import json
register = Library()
@register.filter(is_safe=True)
def js(obj):
return mark_safe(json.dumps(obj))
このテンプレート フィルターは、変数を JSON 文字列に変換します。次のように使用できます。
// myapp/templates/example.html
{% load js %}
<script type="text/javascript">
var someVar = {{ some_var | js }};
</script>
私のために働いた解決策は、テンプレートの非表示の入力フィールドを使用することです
<input type="hidden" id="myVar" name="variable" value="{{ variable }}">
次に、この方法でjavascriptの値を取得します。
var myVar = document.getElementById("myVar").value;
これが私が非常に簡単にやっていることです: テンプレート用に base.html ファイルを変更し、それを一番下に置きました:
{% if DJdata %}
<script type="text/javascript">
(function () {window.DJdata = {{DJdata|safe}};})();
</script>
{% endif %}
次に、JavaScript ファイルで変数を使用する場合は、DJdata 辞書を作成し、それを json によってコンテキストに追加します。context['DJdata'] = json.dumps(DJdata)
それが役に立てば幸い!
辞書の場合は、最初に JSON にエンコードするのが最善です。simplejson.dumps() を使用するか、App Engine のデータ モデルから変換する場合は、GQLEncoder ライブラリの encode() を使用できます。
私は同様の問題に直面しており、S.Lott が提案した回答が役に立ちました。
<script type="text/javascript">
var a = "{{someDjangoVariable}}"
</script>
ただし、ここで主な実装上の制限を指摘したいと思います。JavaScript コードを別のファイルに配置し、そのファイルをテンプレートに含めることを計画している場合。これはうまくいきません。
これは、メイン テンプレートと JavaScript コードが同じファイルにある場合にのみ機能します。おそらく、django チームはこの制限に対処できます。
変数を外部の .js スクリプトに渡したい場合は、グローバル変数を宣言する別のスクリプト タグをスクリプト タグの前に置く必要があることに注意してください。
<script type="text/javascript">
var myVar = "{{ myVar }}"
</script>
<script type="text/javascript" src="{% static "scripts/my_script.js" %}"></script>
data
通常どおりビューで定義されますget_context_data
def get_context_data(self, *args, **kwargs):
context['myVar'] = True
return context