干草堆搜索结果:如何在page.object_list中为不同的模型使用不同的模板?

Cas*_*man 11 django django-templates django-haystack

我正在使用带有Solr后端的Haystack将搜索添加到现有的Django站点.我希望我的搜索能够在几个不同的模型中工作,并返回一组结果.

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

到目前为止,我只是使用示例搜索模板的略微修改版本.在模板中,结果来自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 %}
Run Code Online (Sandbox Code Playgroud)

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

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

Cas*_*man 18

好吧,呃,在问了这个之后我立刻深入了解了Haystack文档,并找到了我需要的东西:

{% ifequal result.model_name 'apple' %}
  Apple: {{ result.object.titlefield_for_apple }}
{% else %}
  Orange: {{ result.object.otherfield_for_orange }}
{% endifequal %}
Run Code Online (Sandbox Code Playgroud)

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

  • model_name - 模型的名称.
  • model - 模型类.
  • verbose_name - 用于显示的模型类名的更漂亮版本.