Результаты поиска в Haystack: как использовать разные шаблоны для разных моделей в page.object_list?

Я добавляю поиск на существующий сайт Django, используя Haystack с бэкэндом Solr. Я хочу, чтобы мой поиск работал с несколькими разными моделями и возвращал один набор результатов.

При повторении результатов я хотел бы отформатировать каждый результат в зависимости от типа модели, например. если результатом является Apple, используйте один шаблон результата, но если он оранжевый, используйте другой шаблон.

До сих пор я просто использовал слегка измененную версию примера шаблон поиска. В шаблоне результаты заносятся в 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), чтобы идентифицировать его, но это кажется неэлегантным. Бьюсь об заклад, это можно сделать с помощью настраиваемых тегов шаблонов, но у меня нет опыта с ними.

Ответ 1

Итак, сразу после этого я углубился в документы в стопку и нашел именно то, что мне нужно:

{% ifequal result.model_name 'apple' %}
  Apple: {{ result.object.titlefield_for_apple }}
{% else %}
  Orange: {{ result.object.otherfield_for_orange }}
{% endifequal %}

Что совершенно имеет смысл, потому что, конечно, Haystack должен передать типы обратно с результатами. Он фактически передает несколько версий информации о типе, для удобства использования в шаблоне:

  • имя_модели - название модели.
  • модель - класс модели.
  • verbose_name - более красивая версия имени класса моделей для отображения.