我要做的是在网页上提供搜索功能,在加载页面时显示所有数据。数据集不是很大(想想< 500项),因此提供一些不需要页面刷新(或任何请求)的搜索功能将非常用户友好。我查看了一些有趣的Javascript库(在this answer中总结),特别是Fuse.js和Lunr.js看起来非常适合我的场景。
问题在于我不知道如何将这些库(似乎只通过JSON搜索)应用于Django传递的上下文。我只是触及了Django功能的表面,因为我几天前才开始研究它,所以请原谅我,如果我错过了一些明显的东西。谢谢!
答案 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)。希望表现在生产中是正确的,但它看起来非常有前景!