Django + JS - 切换过滤器视图

时间:2015-12-07 20:31:16

标签: javascript jquery python django django-q

目前,我正在开发的Django项目除了其他功能外,还具有上传" blackbox"转换为"数据点"的文件(Python dicts列表)以及通过黑盒过滤以仅显示基于过滤器的某些数据点。如果用户想要在应用过滤器后切换到黑盒子的未过滤视图,则用户必须手动清除键入过滤器窗体的过滤器并应用空过滤器。如果用户想要返回与之前相同的过滤器,则用户必须重新进入过滤器。这两个操作都需要重新查询数据库。输入的过滤器将转换为Django Q对象。

我现在想要的是添加功能,以便在黑盒子的未过滤视图和最近使用的过滤器之间快速切换。这里的重要思想是确保此切换不会不必要地查询数据库。我不确定如何继续,这是否应该完全在客户端(jQuery等)或至少部分在服务器端(Django)完成。前端当前使用Clusterize.js来优化滚动黑盒子的数据点。下面是显示黑匣子数据点的前端代码片段:

function display_filtered_blackbox(blackbox_id, filter, e) {
    ....
    var url = "/api/bb/" + bb_id + "f/"
    $.getJSON(url, function(datapoints){
        // datapoints is a list of tuples, each tuple represents a datapoint: (substituted format string, datapoint id)
        display_filtered_datapoints(datapoints, blackbox_id, url);
        ....
    }
}
function display_filtered_datapoints(filtered_datapoints, blackbox_id, url) {
    ....
    for(i in datapoints){
        clusterize.append(["<div class=list-group-item style='max-height: 42px; white-space: nowrap;' onclick=showDatapointDetail("+bb_id +","+i+")>" + datapoints[i][0]+"</div>"]);
    }
    ....
}

那么我应该如何制作这样的快速过滤器切换?我觉得我想以某种方式缓存Django端过滤器的数据点以快速切换,但我不确定如何继续这个想法或扩展它。

2016年1月4日更新

到目前为止,我所尝试的是为最近使用的过滤器创建全局变量,过滤器的最新url,以及每次调用toggle_filter函数时都会切换的布尔值(所有这些都在jQuery)。用于打开/关闭过滤器的按钮的html如下:

<button onclick='toggle_filter(this.form.bb_id.value)'> Toggle Filter </button>

当用户首次应用过滤器时,全局布尔值isFiltered将设置为true。还设置了过滤数据点集和过滤器URL的全局变量。以下是我对实际toggle_filter函数的尝试:

function toggle_filter(blackbox_id) {
    // recent_filter_url, recent_filtered_points, and isFiltered are the aforementioned globals
    alert("Calling toggle filter; \n" + recent_filter_url + "\n" + bb_id + "\n" + isFiltered);
    if (isFiltered == true) {
        console.log("Filter toggled on");
        console.log(isFiltered);
        clusterize.clear();
        display_filtered_datapoints(recent_filtered_points, blackbox_id, recent_filtered_url);
        isFiltered = false;
    }
    else {
        console.log("Filter toggled off");
        console.log(isFiltered);
        clusterize.clear();
        display_points(blackbox_id); // the function that displays all the datapoints of a blackbox, unfiltered
        isFiltered = true;
    }
}

警报当前是作为调试来确保在单击按钮时调用该函数,以及确保全局变量具有正确的值。然而,在警报之后,该网站返回到最近上传的黑匣子的主页。有时,在站点重定向之前,控制台中会显示错误消息。此外,网址从

更改
localhost:8000

localhost:8000/?bb_id=42&new_filter=stream_type%3Dhf
浏览器中的

,不在urls.py中。我觉得我搞砸了一些简单的东西,但我无法弄明白。

0 个答案:

没有答案