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

时间:2015-01-30 11:38:49

标签: javascript django fuse.js

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

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

2 个答案:

答案 0 :(得分:2)

您只需在模板中输出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>

答案 1 :(得分:0)

虽然Daniel(在评论中)肯定是正确的告诉我如何将JSON添加到上下文中 - 我可能应该以不同的方式表达问题。但我离题了。

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

然而,使用Mustache.js生成HTML并不是那么糟糕,因为这使我可以轻松地使用搜索算法生成的搜索结果来操作页面(在我的案例中为Fuse.js)。希望表现在生产中是正确的,但它看起来非常有前景!