1

私はこれを理解できないようです。{{variable}}を使用して変数をレンダリングするPython/Djangoテンプレートがあり、ユーザーがボタンをクリックしたときにHTMLページでJavascriptを使用して変数を操作しようとしています。

私が見ている問題は、Javascriptが{{を異なる方法で処理しているように見えるため、HTMLとしてレンダリングするときに、変数を変換しないことです(つまり、以下のコードの5ではなく「+id+」と表示されます。

function changeDate()
  id = 5;
  html = "{{ variable[" + id + "] }}";
  document.getElementById('test').innerHTML = html;

私は次のようにそれらをエスケープしようとしました: "{{"そしてそれはうまくいくようです(つまり、'id'を5に変換します)が、Pythonは文字列を変数として解釈せず、ページに文字列を表示するだけですその変数の実際の値ではなく、{{variable[5]}}として。

私の推測では、これは、ページが既にレンダリングされたにJavascriptがDIVを新しいテキストに変換しているために発生するため、Pythonは最初にページをレンダリングするときに変数を変換する機会がありません。

したがって、2つの可能な解決策があると思います。

  1. 文字列に{{と}}を残したまま、変数を適切にレンダリングする方法を見つけます

また

  1. Javascriptで表示される前に、Pythonに文字列バージョンの{{variable[5]}}を解釈させる方法を理解してください。

どんな助けでも大歓迎です!

4

1 に答える 1

2

Djangoのテンプレートレンダリングは、検索/置換のような置換を行うだけです。中括弧内の文字列を取得し、その文字列を辞書が渡されるキーとして使用します。

ディクショナリ値にデータ構造としてアクセスしようとはしません。代わりに、文字列表現を取得します。

それで、

data = {"variable": ["a", "b", "c"] }

「variable」という名前のdtemplate内で取得できますが、「variable [0]」にアクセスしようとすると、レンダリングテンプレートでNameErrorが発生するはずです。これは、「variable[0]」が上記のデータディクショナリのキーではないためです。 。

これに対処する1つの方法は、インデックス作成部分をクライアント上のjavascriptコードに延期し、データディクショナリ上のオブジェクトのjavascriptエンコード(json)文字列を渡すことです。

import json

function changeDate()
  id = 5
  variable = ["bla", "ble", "bli", "blo", "blu", "blew"]
  html = """<script> id = {{id}};
            document.write({{variable}}[id]);
            </script>
          """
  data = {"variable": json.dumps(variable), "id": id};

このデータを渡して、htmlテンプレートでレンダリングします。

于 2013-02-06T21:27:02.390 に答える