resultados da busca Haystack: como usar modelos diferentes para diferentes modelos em page.object_list?

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

Pergunta

Eu estou adicionando pesquisa para um site de Django existente, usando Haystack com um backend Solr. Eu quero a minha pesquisa para o trabalho em vários modelos diferentes, e retornar um único conjunto de de resultados.

Quando a iteração através dos resultados, eu gostaria de formatar cada resultado com base no que tipo de modelo que é - por exemplo, se o resultado for um Apple, o uso de um modelo de resultado, mas se é uma laranja, use um modelo diferente.

Até agora, eu só estou usando uma versão ligeiramente modificada do exemplo modelo de pesquisa . No modelo, os resultados vêm em 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 %}

Isto não funciona, aparentemente porque isinstance () não está disponível dentro de um modelo. Então, como eu posso controlar a lógica modelo com base no tipo de modelo de um objeto? Existe outra função que eu posso usar dentro de um modelo que faz a mesma coisa?

Acho que eu poderia testar vários campos do objeto (if result.object.otherfield_for_orange) para identificá-lo, mas que parece deselegante. Aposto que isso poderia ser feito com etiquetas modelo personalizado, mas eu não tenho nenhuma experiência com aqueles.

Foi útil?

Solução

Ok, duh, imediatamente depois de pedir isso eu cavou mais fundo na Haystack docs , e encontrou exatamente o que eu preciso:

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

O que totalmente faz sentido, porque, naturalmente, Haystack deve passar os tipos de volta com os resultados. Ele realmente passa várias versões da informação de tipo, para facilitar o uso no modelo:

  • nome_do_modelo -. O nome do modelo
  • modelo -. A classe modelo
  • verbose_name - Uma versão mais bonita do nome da classe do modelo para exibição
  • .
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top