2

主な問題は、コンテンツを配置するブロックをプログラムでどのように選択できるかです。以下は別のプロジェクトで機能していますが、新しいプロジェクトでは何らかの理由で機能しません。両方のプロジェクトで、同じマシンで同じ (既定の) テンプレート コンテキスト プロセッサを使用しています。

このような基本テンプレートがあります

...
{% block Title %}<h1>Whoo</h1>{% endblock %}

{% block Content %}<p>Hi there</p>{% endblock %}
...

そして、このような拡張テンプレート

{% extends "base.html" %}
...
{% block myblock.name %} <p> {{ myblock.content }} </p> {% endblock %}

<p> {{ myblock.name }} </br> {{ myblock.content }} </p>
...

そして、そのようにレンダリングする

myblock = { 'name': 'Title', 'content': 'stuff' }
return render_to_response( 'extended.html', {'myblock': myblock}, context_instance=RequestContext(request) )

私は取得し、最初のプロジェクトに参加することを期待しています:

...
<p> stuff <p>
<p>Hi there</p>
<p> Title </br> stuff </p>
...

しかし、2番目のプロジェクトでは

...
<h1>Whoo</h1>
<p>Hi there</p>
<p> Title </br> stuff </p>
...

そのため、2 番目のプロジェクトでは、myblock dict がテンプレートによって渡されて処理されますが、{% block myblock.name %} の myblock.name は、変数ではなくリテラルとして解釈されるようです。Django に {% block %} タグ内の変数を強制的に評価させる方法についてのアイデアはありますか?

4

1 に答える 1

2

テンプレートの継承に関するドキュメントをもう一度確認する必要があります。

...ブロックタグは、子テンプレートが入力できる[...]ブロックを定義します。ブロックタグが行うのは、子テンプレートがテンプレートのこれらの部分をオーバーライドできることをテンプレートエンジンに通知することだけです。

ただし、実行しようとしているように、ビュー内のブロックに変数を直接割り当てることはありません。

そして、 {% block myblock.name %}あまりにも奇妙に見えます。

あなたが期待している結果を受け取るために、私はテンプレートがむしろこのように見えるべきだと思います

{% extends "base.html" %}
{% block Title %}<p>{{ myblock.content }}</p>{% endblock %}

renderDjangoの最新バージョンを使用していると仮定すると、ビューのショートカットを使用して物事を単純化することもできます。

return render(request, 'extended.html', {'name': 'Title', 'content': 'stuff'})

これにより、次のようなテンプレートが作成されます。

{% extends "base.html" %}
{% block Title %}<p>{{ content }}</p>{% endblock %}
于 2012-11-09T22:09:34.747 に答える