resultados de la búsqueda pajar: cómo utilizar diferentes plantillas para diferentes modelos de page.object_list?

StackOverflow https://stackoverflow.com/questions/1460543

Pregunta

Estoy agregando búsqueda a un sitio Django existente, utilizando Pajar con un motor de Solr. Quiero que mi búsqueda de trabajo a través de varios modelos diferentes, y devolver un único conjunto de los resultados.

Cuando iteración a través de los resultados, me gustaría dar formato a cada resultado en base a qué tipo de modelo es - por ejemplo, si el resultado es una manzana, utilizar una plantilla de resultados, pero si se trata de una naranja, utilizar una plantilla diferente.

Hasta el momento, sólo estoy usando una versión ligeramente modificada del ejemplo plantilla de búsqueda . 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 plantilla basada en el tipo de modelo de un objeto? ¿Hay otra función que pueda utilizar dentro de una plantilla que hace lo mismo?

supongo que podría probar varios campos del objeto (if result.object.otherfield_for_orange) para identificarlo, pero que parece poco elegante. Apuesto a que esto se podría hacer con etiquetas de plantilla de encargo, pero no tengo ninguna experiencia con ellos.

¿Fue útil?

Solución

Bueno, duh, inmediatamente después de hacer esta Cavé más profundamente en el docs Haystack , y se 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, porque, por supuesto, debe pasar Haystack los tipos de vuelta con los resultados. En realidad, pasa varias versiones de la información de tipo, para facilitar su uso en la plantilla:

  • nombre_del_modelo -. El nombre del modelo
  • modelo -. La clase de modelo
  • verbose_name -. Una versión más bonita del nombre de la clase del modelo de pantalla
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top