Результаты поиска в стоге сена: как использовать разные шаблоны для разных моделей в page.object_list? - PullRequest
11 голосов
/ 22 сентября 2009

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

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

1 Ответ

18 голосов
/ 22 сентября 2009

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

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

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

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