2009-09-22 3 views
11

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

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

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

ответ

17

Хорошо, дух, сразу же после того, как просить это я копал глубже в Haystack docs, и нашел именно то, что мне нужно:

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

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

  • model_name - название модели.
  • модель - модель класс.
  • verbose_name - более красивая версия имени класса модели для отображения.
Смежные вопросы