これと同様の問題が発生しました。重要なのは、正しいデータをコンテキストに取り込むことです。私たちが行ったのは、各ビューのデータ作成/コンテキスト入力を個別のコンテキスト構築ルーチンに分割することでした。元のビューは、それぞれのルーチンを呼び出してから、テンプレートをレンダリングするだけです。複合ビューは、各コンテキストビルダーを呼び出してから、マスターテンプレートをレンダリングします。マスターテンプレートには、サブテンプレートが含まれます。
ここで、Djangoテンプレートシステムで少し問題が発生しました。テンプレートフラグメントをキャッシュしていましたが、これらのフラグメントの一部は、生成に非常にコストのかかるデータを取得していました。フラグメントが古くない場合、私たちは間違いなくその作業をしたくありませんでした。しかし、必要であることがわかるまで作業を遅らせることは、テンプレート内にいることを意味し、次のようになります。
- テンプレート内からメソッドにパラメーターを渡すことはできません。
- django.template .__ init __。Variable._resolve_lookup()メソッドは、呼び出し可能オブジェクトを渡した場合に呼び出されないという点で壊れていました。コンテキスト内のオブジェクトのメソッドを参照する場合、それは問題なく機能します。
呼び出し可能オブジェクトが機能する必要がある理由は、カリー化された関数、つまり、パラメーターの一部(またはすべて)がすでに指定されているが、まだ呼び出されていない関数を渡すことができるためです。したがって、ビュー(またはこの場合はコンテキストビルド)は、完全に指定された関数をカレーできる必要があります(テンプレート自体にパラメーターを渡すことはできません)。これにより、必要なときにテンプレートが呼び出し可能オブジェクトを呼び出すことができます。データ、そして離れて行きます。
これには2つの別々のアプローチを取りました。
- djangosnippets.orgのexprテンプレートタグを使用しました
- 呼び出し可能オブジェクトを機能させるために、djangoテンプレートコードをハッキングしました(送信されたがまだ処理されていないパッチを使用しました)。
このサイトを作成してから、遅延データプロデューサーとしてジェネレーターを使用することで解決できた可能性があることを学びました。ジェネレーターはカリー化された関数のように機能しますが(セットアップに任意のパラメーターを渡すことができるという点で)、テンプレートエンジンはそれらを単なる別のイテレーターと見なします。このテーマに関する素晴らしいチュートリアルがあります。注:ジェネレーターは配列ではなく、一度しか使用できないため、ロジックの一部を微調整する必要がある場合があります。
次回は、 jinja2テンプレートを使用して、Djangoのテンプレートを使用するのをやめると思います。