2009-09-22 11 views
11

Estoy agregando búsqueda a un sitio existente de Django, usando Haystack con un servidor de Solr. Quiero que mi búsqueda funcione en varios modelos diferentes y devuelva un único conjunto de resultados.Resultados de búsqueda de pajar: cómo usar diferentes plantillas para diferentes modelos en page.object_list?

Cuando repito los resultados, me gustaría formatear cada resultado en función del tipo de modelo que es, p. Ej. si el resultado es una manzana, use una plantilla de resultados, pero si es naranja, use una plantilla diferente.

Hasta ahora, solo estoy usando una versión ligeramente modificada del ejemplo search template. En la plantilla, los resultados vienen en 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 %} 

Esto no funciona, al parecer porque isinstance() no está disponible dentro de una plantilla. Entonces, ¿cómo puedo controlar la lógica de la plantilla en función del tipo de modelo de un objeto? ¿Hay alguna otra función que pueda usar dentro de una plantilla que haga lo mismo?

Supongo que podría probar varios campos del objeto (if result.object.otherfield_for_orange) para identificarlo, pero parece poco elegante. Apuesto a que esto podría hacerse con etiquetas de plantilla personalizadas, pero no tengo experiencia con ellas.

Respuesta

17

Ok, duh, inmediatamente después de hacer esta Cavé más profundamente en el Haystack docs, y encontré exactamente lo que necesito:

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

Lo que hace totalmente sentido, debido a Haystack curso debe pasar los tipos de vuelta con los resultados . De hecho, pasa varias versiones de la información del tipo, para facilitar su uso en la plantilla:

  • model_name - El nombre del modelo.
  • modelo
  • - La clase de modelo.
  • verbose_name: una versión más bonita del nombre de clase del modelo para mostrar.
Cuestiones relacionadas