2009-09-22 4 views
11

J'ajoute la recherche à un site Django existant, en utilisant Haystack avec un backend Solr. Je souhaite que ma recherche fonctionne sur plusieurs modèles différents et renvoie un seul ensemble de résultats. Lors de l'itération des résultats, je voudrais formater chaque résultat en fonction du type de modèle, par exemple:Haystack résultats de la recherche: comment utiliser différents modèles pour différents modèles dans page.object_list?

Si le résultat est un Apple, utilisez un modèle de résultat, mais si c'est un Orange, utilisez un modèle différent.

Jusqu'à présent, je suis en train d'utiliser une version légèrement modifiée de l'exemple search template. 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 en fonction du 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 différents champs de l'objet (if result.object.otherfield_for_orange) pour l'identifier, mais cela semble inélégant. Je parie que cela pourrait être fait avec des balises de modèles personnalisés, mais je n'ai aucune expérience avec ceux-ci.

Répondre

17

Ok, bah, immédiatement après avoir demandé ce que je plongeai dans le 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 %} 

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

  • nom_modèle - Le nom du modèle.
  • modèle - La classe du modèle.
  • verbose_name - Une version plus jolie du nom de la classe du modèle pour l'affichage.
Questions connexes