11

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)のさまざまなフィールドをテストして識別できると思いますが、それはエレガントではないようです。これはカスタムテンプレートタグで実行できると思いますが、私はそれらの経験がありません。

4

1 に答える 1

18

わかりました。これを尋ねた直後に、 Haystackのドキュメントを深く掘り下げて、必要なものを正確に見つけました。

{% 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-表示用のモデルのクラス名のより美しいバージョン。
于 2009-09-22T14:55:54.067 に答える