他の処理済みテンプレートからテンプレートを結合する方法は?

StackOverflow https://stackoverflow.com/questions/283300

  •  08-07-2019
  •  | 
  •  

質問

app1、app2、app3などの複数のアプリを含むdjangoプロジェクトpro1があります。各アプリからのブロックを含むトップレベルのテンプレートを表示したい:

example_base_template.html:

[header /]
[left nav bar]{{ app1 rendered template }}[/left nav bar]
[right nav bar]{{ app2 rendered template }}[/right nav bar]
[center section]{{ app1 main functionality template }}[/center section]
[footer]{{ app3 rendered template }}{{ app4 rendered template }}[/footer]

これらのアプリテンプレートはすべて動的で、DBを使用します。最も適切でエレガントな方法でそれを行う方法は?または、4つの異なるビューを1つのURLに接続する方法が問題なのでしょうか?

役に立ちましたか?

解決

これと同様の問題があり、キーはコンテキストに正しいデータを取得することです。私たちがしたことは、各ビューのデータ作成/コンテキスト入力を個別のコンテキスト構築ルーチンに分割することでした。元のビューはそれぞれのルーチンを呼び出すだけで、テンプレートをレンダリングします。複合ビューは各コンテキストビルダーを呼び出し、マスターテンプレートをレンダリングします。その後、マスターテンプレートにはサブテンプレートが含まれます。

ここで、Djangoテンプレートシステムで少し問題が発生しました。テンプレートフラグメントをキャッシュしていましたが、これらのフラグメントの一部は、生成に非常に高価なデータを受け取りました。フラグメントが古くない場合、私たちは間違いなく作業をしたくありませんでした。しかし、作業が必要であるとわかるまで作業を遅らせることは、テンプレート内にいることを意味し、

  • テンプレート内からメソッドにパラメーターを渡すことはできません。
  • callableを渡した場合、django.template .__ init __。Variable._resolve_lookup()メソッドは壊れていました。コンテキストでオブジェクトのメソッドを参照する場合、それはうまく機能します。

callableが機能する必要がある理由は、カリー化された関数(つまり、パラメーターの一部(またはすべて)が指定されているが、まだ呼び出されていないの関数)を渡すことができるためです。 したがって、ビュー(またはケースのコンテキストビルド)は完全に指定された関数をカリー化できる必要があります(テンプレート自体にパラメーターを渡すことはできません)。 to はcallableを呼び出し、データを取得し、すぐに終わります。

これには2つの異なるアプローチを取りました。

  • djangosnippets.orgのexprテンプレートタグ
  • を使用しました
  • djangoテンプレートコードをハッキングしてcallableを機能させました(提出済みだがまだ処理されていないパッチを使用しました)。

このサイトを作成してから、ジェネレータを遅延データプロデューサとして使用することで解決できる可能性があることを学びました。ジェネレータは、カリー化された関数のように機能します(セットアップに任意のパラメータを渡すことができるという点で)が、テンプレートエンジンはそれらを単なる別のイテレータと見なします。このテーマに関する優れたチュートリアルがあります。注:ジェネレーターは配列ではなく、一度しか使用できないため、一部のロジックを調整する必要がある場合があります。

次回は、 jinja2テンプレートを使用して、Djangoのテンプレートのねじ込みをやめると思います。

他のヒント

{%include%} タグ。しかし、それはあまり役に立ちません。より良い解決策は、カスタム包含タグ必要なテンプレートと機能。

(簡単な方法で)複数のビューを1つに混在させることはできません。かなりのdjangoソリューションにタグを付けてみてください。

これには、含めるアプリケーションごとにカスタムテンプレートタグを記述しました。最初に、テンプレートタグはハードコードされたhtmlを返しました。後で、タグが独自のテンプレートフラグメントをロードできることがわかりました。また、どこかに非常によく機能する一般的な最新のコンテンツタグであるスニペットがありました。

多くの再利用可能なアプリ(特に Pinax プロジェクトで選択されたアプリ)は、カスタムの使用方法の優れた例として役立ちます。コンテンツを挿入するテンプレートタグ。 DjangoCon 2008のJames Bennettの talk も役立つ場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top