2009-09-22 10 views
11

Sto aggiungendo la ricerca a un sito Django esistente, usando Haystack con un backrindo Solr. Voglio che la mia ricerca funzioni su diversi modelli e restituisca un singolo insieme di risultati.Risultati di ricerca del pagliaio: come utilizzare modelli diversi per diversi modelli in page.object_list?

Durante l'iterazione dei risultati, mi piacerebbe formattare ogni risultato in base al tipo di modello che è - ad es. se il risultato è una mela, usa un modello di risultato, ma se è arancione, usa un modello diverso.

Finora, sto solo usando una versione leggermente modificata dell'esempio search template. Nel modello, i risultati sono disponibili in 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 %} 

Questo non funziona, a quanto pare perché isinstance() non è disponibile all'interno di un modello. Quindi, come posso controllare la logica del modello in base al tipo di modello di un oggetto? C'è un'altra funzione che posso usare all'interno di un modello che fa la stessa cosa?

Suppongo di poter provare vari campi dell'oggetto (if result.object.otherfield_for_orange) per identificarlo, ma ciò sembra inelegante. Scommetto che questo potrebbe essere fatto con tag modello personalizzati, ma non ho esperienza con quelli.

risposta

17

Ok, duh, subito dopo aver chiesto questo ho scavato più in profondità nel Haystack docs, e ho trovato esattamente quello che mi serve:

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

Il che rende totalmente senso, perché naturalmente Haystack dovrebbe passare i tipi di nuovo con i risultati . In realtà passa diverse versioni del tipo informazioni, per un facile utilizzo nel modello:

  • nome_modello: il nome del modello.
  • modello - La classe del modello.
  • verbose_name - Una versione più carina del nome della classe del modello per la visualizzazione.
Problemi correlati