我正在使用 Haystack 和 Solr 后端向现有 Django 站点添加搜索。我希望我的搜索能够跨多个不同的模型运行,并返回一组结果。

迭代结果时,我想根据每个结果的模型类型来格式化每个结果 - 例如如果结果是苹果,则使用一个结果模板,但如果结果是橙色,则使用不同的模板。

到目前为止,我只是使用示例的稍微修改的版本 搜索模板. 。在模板中,结果位于 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 %}

这不起作用,显然是因为 isinstance() 在模板内不可用。那么,如何根据对象的 Model 类型来控制模板逻辑呢?我可以在模板中使用另一个函数来执行相同的操作吗?

我想我可以测试对象的各个字段(if result.object.otherfield_for_orange)来识别它,但这似乎不优雅。我打赌这可以通过自定义模板标签来完成,但我对此没有经验。

有帮助吗?

解决方案

好吧,呃,问完这个问题后,我立即深入研究了 干草堆文档, ,并找到了我所需要的:

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

这完全有道理,因为 Haystack 当然应该将类型与结果一起传回。它实际上传递了多个版本的类型信息,以便于在模板中使用:

  • model_name - 模型的名称。
  • model - 模型类。
  • verbose_name - 用于显示的模型类名称的更漂亮版本。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top