对搜索结果的查询集进行排序并通过 ajax 呈现

Posted

技术标签:

【中文标题】对搜索结果的查询集进行排序并通过 ajax 呈现【英文标题】:Sorting queryset of search result and render back thru ajax 【发布时间】:2013-01-25 02:47:25 【问题描述】:

我遇到了这个问题:我有一个搜索结果页面,其中有几个结果。我希望用户能够根据某些标准对结果进行排序。我在 AJAX 中这样做。问题是如何将来自服务器的排序数据再次渲染到字段。

function sort()
    var sortid = $('#sort').val();
    $.ajax(
        type: "POST",
        url: "/sort/",
        data:  sortid: sortid ,
    ).done(function(data)
        // how to render this sorted 'data' back to <td>s?  
    );

这是我的绑定代码:

<select onchange="sort()" id="sort">   
    <option>price</option>
    <option>rate</option>
</select>

这是结果的地方:

<tr class="result">
    <td>
        <li>loc.locationname</li>
    </td>
    <td>    
        <li>loc.rating</li>
    </td>
    <td>
        <li>loc.price</li>
    </td>
</tr>

【问题讨论】:

你的ajax调用的结果是什么? @Chris,来自服务器的排序查询集。我只想知道如何渲染回td's @RoryMcCrossan,很容易在我的代码中看到这一点:&lt;option&gt;price&lt;/option&gt; &lt;option&gt;rate&lt;/option&gt; @doniyor 是的,我刚刚看到了。顺便说一句,您的 html 无效 - 您只能在 olul 中包含 li 元素,而不是 td @RoryMcCrossan,是的,谢谢,我知道,但这不是问题所在。 【参考方案1】:

您的视图可以返回一个渲染的 sn-p,就像您可以在客户端渲染到一个 div 中一样

您的 ajax 调用可能如下所示

function sort()
    var sortid = $('#sort').val();
    $.ajax(
        type: "POST",
        url: "/sort/",
        data:  sortid: sortid ,
    ).done(function(data)
         $('#results-div').html(data.html);
    );

示例视图

import json
from django.shortcuts import HttpResponse
from django.template import loader, RequestContext


def my_view(request, query=None):
    # trivialized example

    sortid = request.REQUEST.get('sortid')

    # you might want to store the results into cache 
    results = MyModel.objects.filter(name__icontains=query).order_by(sortid)

    if request.is_ajax():
       t = loader.get_template('search_results.html')
       html = t.render(RequestContext('results': results))
       return HttpResponse(json.dumps('html': html))
    # handle the other cases here 

search_results.html 内部,您只需将结果呈现到您的表格中

% for loc in results %
<tr class="result">
    <td>
        <li>loc.locationname</li>
    </td>
    <td>    
        <li>loc.rating</li>
    </td>
    <td>
        <li>loc.price</li>
    </td>
</tr>
% endfor % 

【讨论】:

谢谢,这应该可以。但这与render_to_response 没有什么不同,【参考方案2】:
 function(data)
   var tablehtml='<tbody>'
   $.each(data,function(i,res) 
       tablehtml+='<tr class="result">'+
                   '<td><li>'+res.locationname+'</li></td>'+
                   //...
       );
    $("table").html(tablehtml+'</tbody'>)
    

nb:我添加了 tbody 标记,因为如果 html 包含在单个父级中,则这种添加 html 的方式比它是一个(长)节点列表要快得多

euh... 编辑,但要使用它,您需要在 .ajax 中告知您期待 json 响应 (datatype:'json'),但现在情况并非如此

您还需要从服务器发送一个特定的标头(“content-type:application/json”)

如果你坚持发送 html 然后在服务器端解析数据(包装它)并在回调中立即附加它

如果你想重新考虑你的排序功能概念,如果数据不是那么大&如果你可以 gzip;我会立即加载所有数据并在 js 中进行排序(不再需要服务器调用该功能对用户来说会更快:页面加载等待时间稍长,但之后会立即排序

【讨论】:

我认为他返回的是 HTML,而不是 JSON。 是的,刚才看到了,我的错,但是在这种情况下,json似乎更合适 我同意。这将使排序更加简单。您需要做的就是修改 DOM 以添加排序后 JSON 中的数据。 @RoryMcCrossan 取决于数据的大小( 很公平,那么你得到的是什么数据类型呢?这将是您应该在问题中提出的非常相关的信息。

以上是关于对搜索结果的查询集进行排序并通过 ajax 呈现的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环内循环并通过 AJAX 调用对 JSON 对象的结果进行排序?

union和union all

21《MySQL 教程》ORDER BY 排序

使用 ajax 显示查询的记录结果

Handsontable 通过 json/ajax 对来自后端数据库的数据进行排序

如何在熊猫/python中的行标题中通过部分搜索对数据集进行排序