【问题标题】:Haystack search results: how to use different templates for different models in page.object_list?Haystack 搜索结果:page.object_list 中的不同模型如何使用不同的模板?
【发布时间】:2009-09-22 14:49:08
【问题描述】:

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

在遍历结果时,我想根据模型类型来格式化每个结果——例如如果结果是 Apple,则使用一个结果模板,但如果是 Orange,则使用不同的模板。

到目前为止,我只是使用示例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) 的各个字段来识别它,但这似乎不太优雅。我敢打赌这可以通过自定义模板标签来完成,但我没有这些经验。

【问题讨论】:

    标签: django django-templates django-haystack


    【解决方案1】:

    好的,呃,在问完这个问题后,我立即深入研究了Haystack docs,并找到了我需要的东西:

    {% 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 - 用于显示的模型类名的更漂亮的版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2015-10-27
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多