我正在使用带有Solr后端的Haystack将搜索添加到现有的Django站点。我希望我的搜索可以在几个不同的模型中工作,并返回一组结果。
在迭代结果时,我想根据它的模型类型格式化每个结果 - 例如如果结果是Apple,请使用一个结果模板,但如果它是橙色,请使用其他模板。
到目前为止,我只使用了示例search template的略微修改版本。在模板中,结果来自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
)以识别它,但这看起来不够优雅。我打赌这可以通过自定义模板标签完成,但我没有经验。
答案 0 :(得分:18)
好吧,呃,在问这个之后我立刻深入研究Haystack docs,找到了我需要的东西:
{% ifequal result.model_name 'apple' %}
Apple: {{ result.object.titlefield_for_apple }}
{% else %}
Orange: {{ result.object.otherfield_for_orange }}
{% endifequal %}
这完全有道理,因为Haystack当然应该将结果传回去。它实际上传递了类型信息的几个版本,以便在模板中使用: