干し草の山の検索結果:page.object_list で異なるモデルに異なるテンプレートを使用するにはどうすればよいですか?

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

質問

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 - 表示用のモデルのクラス名のより適切なバージョン。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top