【问题标题】:Using a Javascript search algorithm on a Django context variable在 Django 上下文变量上使用 Javascript 搜索算法
【发布时间】:2015-03-29 21:11:29
【问题描述】:
我正在尝试在加载页面时显示所有数据的网页上提供搜索功能。数据集不是很大(想想 this answer),尤其是 Fuse.js 和 Lunr.js 看起来非常适合我的场景。
问题是我不知道如何将这些库(似乎专门通过 JSON 搜索)应用到 Django 传递的上下文中。我只触及了 Django 功能的表面,因为我几天前才开始研究它,所以如果我遗漏了一些明显的东西,请原谅我。谢谢!
【问题讨论】:
标签:
javascript
django
fuse.js
【解决方案1】:
虽然 Daniel(在 cmets 中)告诉我如何将 JSON 添加到上下文中当然是正确的 - 我可能应该以不同的方式表达这个问题。但我离题了。
经过更多工作,我现在从对象层次结构中生成正确的 JSON。此 JSON 通过上下文传递,然后与 Mustache.js 一起使用以生成 HTML。我想不出一种将数据作为 JSON 传递的方法 并且 还使用 Django 的模板语言来遍历 JSON。当从另一个方向处理这个问题时,我想不出一种方法来在客户端将常规 Django 上下文(例如带有var.objects.all() 的上下文)转换为 JSON(因为单引号的一些愚蠢的废话......)
尽管如此,使用 Mustache.js 生成 HTML 并不是那么糟糕,因为这让我可以轻松地使用搜索算法(在我的例子中是 Fuse.js)生成的搜索结果来操作页面。希望性能在生产中会正常,但它看起来确实很有希望!
【解决方案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>