干草堆搜索结果:如何在page.object_list中为不同模型使用不同模板?
-
12-09-2019 - |
题
我正在使用 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 - 用于显示的模型类名称的更漂亮版本。
不隶属于 StackOverflow