Plone 有一个漂亮的搜索框,其网站具有类似“Google 建议”的功能。它甚至可以索引上传的文档,例如 PDF。有谁知道可以在 Django 站点中提供这种功能的模块?
1 回答
Plone 通过维护一个单独的索引属性元数据表来实现它的 LiveSearch 功能(最后修改、创建者、标题等字段从内容对象复制到此表中)。内容对象然后发送 ObjectAdded/ObjectModified/ObjectRemoved 事件,事件订阅者监听这些事件并负责更新元数据表(在 Django 中事件被命名为信号)。然后有一个浏览器视图暴露在一个固定的 URL 中,它搜索元数据并返回适当的 LiveSearch HTML,最后每个 HTML 页面都被发送适当的 JavaScript 来处理自动完成 AJAX 功能来查询这个视图并将生成的 HTML 结果放入DOM。
如果您希望 LiveSearch 查询多个模型/内容类型,您可能需要发送自己的事件并让订阅者适当地处理它们。对于较小的数据集或较低流量的站点,这不是必需的,在这些站点中,对单个搜索执行多个查询的性能损失不是问题(或者您只想搜索单个内容类型),您可以只做几个来自您的视图的查询。
至于 JavaScript 方面,您可以自行开发或使用现有的 JavaScript 库。这通常在 JS 库中称为自动完成。初学者有 YUI 自动完成和 Scriptaculous 自动完成,可能还有更多的 JavaScript 自动完成实现。Plone 使用 KSS 作为它的 JavaScript 库,如果要从中寻找示例代码,KSS livesearch 插件是一个很好的起点。
http://pypi.python.org/pypi/kss.plugin.livesearch
还有一个关于在 Django 中使用 KSS 的教程:
http://kssproject.org/docs/tutorial/kss-in-django-with-kss-django-application
KSS 非常好,因为它干净地将行为与客户端的内容分开(无需编写 JavaScript),但 Scriptaculous 在概念上更简单一些,并且具有更好的文档(http://github.com/madrobby/scriptaculous/wikis/ ajax 自动完成器)。