Haystack résultats de la recherche: comment utiliser différents modèles pour différents modèles en page.object_list?

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

Question

Je recherche ajouter à un site Django existant, en utilisant Haystack avec un back-end Solr. Je veux que ma recherche de travailler sur plusieurs modèles différents, et le retour d'un seul ensemble de résultats.

Lorsque itérer les résultats, je voudrais formater chaque résultat en fonction de quel type modèle, il est - par exemple si le résultat est un Apple, utilisez un modèle de résultat, mais si elle est une orange, utilisez un modèle différent.

Jusqu'à présent, je suis juste en utilisant une version légèrement modifiée de l'exemple modèle de recherche . Dans le modèle, les résultats sont disponibles 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 %}

Cela ne fonctionne pas, apparemment parce que isinstance () n'est pas disponible à l'intérieur d'un modèle. Alors, comment puis-je contrôler la logique de modèle basé sur le type de modèle d'un objet? Y at-il une autre fonction que je peux utiliser à l'intérieur d'un modèle qui fait la même chose?

Je suppose que je pourrais tester divers champs de l'objet (if result.object.otherfield_for_orange) pour l'identifier, mais qui semble inélégant. Je parie que cela pourrait être fait avec les balises de modèle personnalisé, mais je l'ai pas d'expérience avec ceux-ci.

Était-ce utile?

La solution

Ok, bah, immédiatement après avoir demandé ce que je me plongeai dans la Haystack docs , et a trouvé exactement ce que je dois:

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

Ce qui tout à fait logique, car bien sûr Haystack doit passer les types de retour avec les résultats. Il passe en fait plusieurs versions de l'information de type, pour une utilisation facile dans le modèle:

  • MODEL_NAME -. Le nom du modèle
  • modèle -. La classe modèle
  • verbose_name -. Une version plus jolie du nom de la classe du modèle pour l'affichage
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top