在 Django 上下文变量上使用 Javascript 搜索算法

Using a Javascript search algorithm on a Django context variable

我想做的是在加载页面时显示所有数据的网页上提供搜索功能。数据集不是很大(想想不到 500 个项目),因此提供一些不需要页面刷新(或与此相关的任何请求)的搜索功能将非常用户友好。我看过一些有趣的 Javascript 库(总结在 this answer), and especially Fuse.js and Lunr.js 看起来非常适合我的场景。

问题是我不知道如何将这些库(它们似乎专门搜索 JSON)应用于 Django 传递的上下文。我只触及了 Django 功能的表面,因为我几天前才开始使用它,如果我遗漏了一些明显的东西,请原谅我。谢谢!

你只需要在你的模板中输出JSON。您可以通过 json.dumps() 直接从您的视图传递它,或者手动遍历模板中的数据以创建 JSON。第一个更好。

因此,使用 Fuse 示例,您的视图将执行:

def my_view(request):
    data = ... get data from wherever ...
    return render(request, 'template.html', {"data": json.dumps(data)})

和模板:

<script type="text/javascript">
    var data = {{ json_data }}
    var options = ...
    var f = new Fuse(data, options)
</script>

虽然丹尼尔(在评论中)告诉我如何将 JSON 添加到上下文中当然是正确的 - 我可能应该用不同的方式来表达这个问题。但是我跑题了。

经过更多工作后,我现在可以从对象层次结构中生成正确的 JSON。这个JSON通过上下文传递,然后与Mustache.js一起使用生成HTML。我想不出一种传递数据的方法,因为 JSON 也使用 Django 的模板语言来遍历 JSON。当从另一个方向接近这个时,我想不出一种方法将常规 Django 上下文(例如带有 var.objects.all() 的上下文)转换为客户端的 JSON(因为一些愚蠢的废话单引号..)

尽管如此,用 Mustache.js 生成 HTML 毕竟还不错,因为这让我可以轻松地使用搜索算法生成的搜索结果来操作页面(在我的例子中 Fuse.js).希望在生产中表现会很好,但它确实看起来很有前途!