2009-09-22 25 views
11

Dodaję wyszukiwanie do istniejącej witryny Django, używając Haystack z backendem Solr. Chcę, aby moje wyszukiwanie działało w kilku różnych modelach i zwracało jeden zestaw wyników.Wyniki wyszukiwania stogu siana: jak korzystać z różnych szablonów dla różnych modeli w page.object_list?

Podczas powtarzania wyników, chciałbym sformatować każdy wynik na podstawie jego typu modelu - np. jeśli wynikiem jest Apple, użyj jednego szablonu wyników, ale jeśli jest to Orange, użyj innego szablonu.

Do tej pory używam tylko nieco zmodyfikowanej wersji przykładu search template. W szablonie, wyniki są w 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 %} 

ten nie działa, podobno dlatego isinstance() nie jest dostępna wewnątrz szablonu. Jak więc kontrolować logikę szablonów na podstawie typu modelu obiektu? Czy istnieje inna funkcja, której mogę użyć wewnątrz szablonu, który robi to samo?

Przypuszczam, że mógłbym przetestować różne pola obiektu (if result.object.otherfield_for_orange), aby go zidentyfikować, ale wydaje się to nieeleganckie. Założę się, że można to zrobić za pomocą niestandardowych tagów szablonów, ale nie mam z tym żadnego doświadczenia.

Odpowiedz

17

Ok, duh, natychmiast po zadaniu tego kopany głębiej Haystack docs i znaleźć dokładnie to, czego potrzebuję:

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

która całkowicie sens, bo oczywiście stogu siana powinien przekazać typy powrotem z wynikami . To faktycznie przechodzi kilka wersji informacji typu, dla łatwego użycia w szablonie:

  • MODEL_NAME - nazwa modelu. Model
  • - Klasa modelu.
  • verbose_name - ładniejsza wersja nazwy klasy modelu do wyświetlenia.
Powiązane problemy