干し草の山の検索結果:page.object_list で異なるモデルに異なるテンプレートを使用するにはどうすればよいですか?
-
12-09-2019 - |
質問
Solr バックエンドを備えた Haystack を使用して、既存の Django サイトに検索を追加しています。検索を複数の異なるモデルにわたって機能させ、単一の結果セットを返したいと考えています。
結果を反復処理するときに、各結果をモデルの種類に基づいてフォーマットしたいと思います。結果が Apple の場合は 1 つの結果テンプレートを使用しますが、Orange の場合は別のテンプレートを使用します。
これまでのところ、私はサンプルを少し変更したバージョンを使用しているだけです 検索テンプレート. 。テンプレートでは、結果は page.object_list に含まれます。
{% if page.object_list %}
<ul>
{% for result in page.object_list %}
<li>
{% if (isinstance(result.object, Apple)) %}
Apple: {{ result.object.titlefield_for_apple }}
{% else %}
Orange: {{ result.object.otherfield_for_orange }}
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>No results found.</p>
{% endif %}
isinstance() がテンプレート内で使用できないため、これは機能しません。では、オブジェクトのモデル タイプに基づいてテンプレート ロジックを制御するにはどうすればよいでしょうか?同じことを行うテンプレート内で使用できる別の関数はありますか?
オブジェクトのさまざまなフィールドをテストできると思います (if result.object.otherfield_for_orange
)それを識別するために使用しますが、それは洗練されていないように思えます。これはカスタム テンプレート タグを使用して実行できると思いますが、私はそれらの経験がありません。
解決
わかりました、そうでしょう、これを尋ねた直後に、私はさらに深く掘り下げました 干し草の山のドキュメント, 、そして私が必要なものを正確に見つけました:
{% ifequal result.model_name 'apple' %}
Apple: {{ result.object.titlefield_for_apple }}
{% else %}
Orange: {{ result.object.otherfield_for_orange }}
{% endifequal %}
もちろん、Haystack は結果とともに型を返す必要があるため、これは完全に理にかなっています。実際には、テンプレートで簡単に使用できるように、型情報のいくつかのバージョンを渡します。
- model_name - モデルの名前。
- model - モデルクラス。
- verbose_name - 表示用のモデルのクラス名のより適切なバージョン。