risultati della ricerca mucchio di fieno: come utilizzare i modelli diversi per i diversi modelli in page.object_list?

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

Domanda

io sono l'aggiunta di ricerca per un sito Django esistente, utilizzando Pagliaio con un backend Solr. Voglio che la mia ricerca per lavorare attraverso diversi modelli, e restituire un unico insieme di risultati.

Quando l'iterazione attraverso i risultati, vorrei formattare ogni risultato in base al tipo di modello che è - per esempio se il risultato è un Apple, utilizzare un modello risultato, ma se si tratta di un Orange, utilizzare un modello diverso.

Finora, sto solo usando una versione leggermente modificata dell'esempio modello di ricerca . 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. Così, come posso controllare la logica del modello in base al tipo di modello di un oggetto? C'è un'altra funzione che posso utilizzare in un modello che fa la stessa cosa?

Suppongo che ho potuto testare diversi campi dell'oggetto (if result.object.otherfield_for_orange) per identificarlo, ma che sembra poco elegante. Scommetto che questo potrebbe essere fatto con i tag di modelli personalizzati, ma non ho alcuna esperienza con quelli.

È stato utile?

Soluzione

Ok, duh, subito dopo aver chiesto questo ho scavato più in profondità nel docs Haystack , e ha 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 di informazioni tipo, per un facile utilizzo nel template:

  • nome_modello -. Il nome del modello
  • modello -. La classe del modello
  • verbose_name -. Una versione più carina di nome della classe del modello per la visualizzazione
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top