【问题标题】:Sorting a filtered list in ascending/descending order in django在django中按升序/降序对过滤列表进行排序
【发布时间】:2011-07-17 03:12:22
【问题描述】:

我使用 Django 创建了一个员工管理系统。我在其中做了一个过滤方法,它基于从下拉菜单和文本输入中选择的选项。过滤工作正常。在第一页上,它提供了整个员工列表,可以按升序和降序显示。在同一页面上给出了过滤方法。过滤后的数据显示在另一页中。现在我想在过滤数据页面上提供一个按钮,单击该按钮以升序/降序显示数据。我为完整的员工列表编写了一个单独的函数,用于在视图中升序和降序。它如何用于此功能。我将在这里粘贴我的代码。请帮我找到解决方案,因为我是 django 编程新手。
我为升序和降序给出了 2 个单独的图像。我想要这样:按升序单击 1 个图像列表;并单击其他图像按降序排列。

过滤器()

def filter(request):
    val3='' 
    if request.GET.has_key('choices'):
        val2=request.GET.get('choices')
    if request.GET.has_key('textField'):
        val3=request.GET.get('textField')
    if request.POST:
        val2=request.POST.get('choices')    
        val3=request.POST.get('textField')
    if val2=='Designation':                
        newData = EmployeeDetails.objects.filter(designation=val3) 
        flag=True 
    elif val2=='Name':
        newData = EmployeeDetails.objects.filter(userName__icontains=val3)
        flag=True 
    elif val2=='EmployeeID':
        newData = EmployeeDetails.objects.filter(employeeID=val3)  
        flag=True       
    elif val2=='Project':
        newData = EmployeeDetails.objects.filter(project=val3)   
        flag=True   
    elif val2=='DateOfJoin':
        newData = EmployeeDetails.objects.filter(dateOfJoin=val3) 
        flag=True       
    else:
        return HttpResponseRedirect('/employeeList/')    
    #tableList = EmployeeDetails.objects.all()
    paginator = Paginator(newData, 10)    
    try:
         page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1
    try:
        contacts = paginator.page(page)
    except (EmptyPage, InvalidPage):
        contacts = paginator.page(0)               
    return render_to_response('filter.html',{'newData':newData,'emp_list': contacts,'val2':val2,'val3':val3,'flag':flag})        

filter.html

<div>
Employees List&nbsp;&nbsp;
<a STYLE="text-decoration:none" align=center href="http://10.1.0.90:8080/sortAscend/ "> <img  src="/static/sort_asc.gif " border="1" height="12" /> </a>
<h4 align="left">
{%for data in newData%}
<a STYLE="text-decoration:none" href ="http://10.1.0.90:8080/singleEmployee/{{data.id}}?choices={{val2}}&textField={{val3}}&flag=1 ">
{{ data.userName}}<br>
{%endfor%} 
</h4>
</div>

升序和降序函数

def sortAscend(request):
    tableList = EmployeeDetails.objects.all().order_by('userName')
    paginator = Paginator(tableList, 12)    
    try:
         page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1
    try:
        contacts = paginator.page(page)
    except (EmptyPage, InvalidPage):
        contacts = paginator.page(0)
    return render_to_response('sortAscend.html', {'emp_list': contacts})

#Method for listing the employees in descending order
def sortDescend(request):
    tableList = EmployeeDetails.objects.all().order_by('-userName')
    paginator = Paginator(tableList, 12)    
    try:
         page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1
    try:
        contacts = paginator.page(page)
    except (EmptyPage, InvalidPage):
        contacts = paginator.page(0)
    return render_to_response('sortDescend.html', {'emp_list': contacts})

sortAscending.html

{%for emp in emp_list.object_list%}
    <tr> <td><a STYLE="text-decoration:none" href ="http://10.1.0.90:8080/singleEmployee/{{emp.id}} "> {{ emp.userName }} </a></td> </tr><td>
{%endfor%}

【问题讨论】:

  • 如果你想要动态排序表格排序,而不生成新页面,请查看 JS。

标签: python django django-models django-templates django-views


【解决方案1】:

我不确定我是否得到了这个问题,但是如果您想对过滤后的对象应用排序,您可能需要添加某种缓存(不同于 django 的内置缓存),它存储过滤后的查询集和排序那。或者您可以使用 django 的会话管理传递过滤器选项并重做排序查询。这需要重构过滤器,以便 if/elif 链独立于该视图并返回过滤后的查询集。

例如:

   def filterHandler(request):
     val3='' 
     if request.GET.has_key('choices'):
        val2=request.GET.get('choices')
     if request.GET.has_key('textField'):
        val3=request.GET.get('textField')
     if request.POST:
        val2=request.POST.get('choices')    
        val3=request.POST.get('textField')
     newData , flag = filter(val2, val3)
     if newData is None:
       return HttpResponseRedirect('/employeeList/')    
     #tableList = EmployeeDetails.objects.all()
     paginator = Paginator(newData, 10)    
     try:
         page = int(request.GET.get('page', '1'))
     except ValueError:
        page = 1
     try:
        contacts = paginator.page(page)
     except (EmptyPage, InvalidPage):
        contacts = paginator.page(0)

     request.session['val2'] = val2
     request.session['val3'] = val3              
     return render_to_response('filter.html',{'newData':newData,'emp_list': contacts,'val2':val2,'val3':val3,'flag':flag})    

    def filter(val2, val3):
      newData = None
      flag = False
      if val2=='Designation':                
        newData = EmployeeDetails.objects.filter(designation=val3) 
        flag=True 
      elif val2=='Name':
        newData = EmployeeDetails.objects.filter(userName__icontains=val3)
        flag=True 
      elif val2=='EmployeeID':
        newData = EmployeeDetails.objects.filter(employeeID=val3)  
        flag=True       
      elif val2=='Project':
        newData = EmployeeDetails.objects.filter(project=val3)   
        flag=True   
      elif val2=='DateOfJoin':
        newData = EmployeeDetails.objects.filter(dateOfJoin=val3) 
        flag=True       
      return newData, flag

现在您的排序方法可以获取最初传递的过滤器值。或者,您也可以将它们作为获取参数添加到视图 url。

【讨论】:

  • 尝试这个我得到一个错误'全局名称 val2 没有定义'?
  • 添加一个val2 = '' 你做val3的地方
【解决方案2】:

在视图级别处理排序的另一种方法是在模板上进行。出于这个原因,您可能想要结帐jquery tablesorter(因为您也在显示中使用表格)。它处理升序/降序排序。

因此,如果您有过滤后准备显示到页面的结果,例如filtered_results.html,您可以这样做。

<!-- filtered_results.html -->
<head>
   ...
   <script type="text/javascript" src="/path/to/jquery-latest.js"></script> 
   <script type="text/javascript" src="/path/to/jquery.tablesorter.js"></script> 
   <script type="text/javascript">
       $(document).ready(function() {
           $("#myTable").tablesorter();
       });
   </script>
</head>
<body>
    <table id="myTable">
        <thead><tr><th>Some-Label</th></tr></thead>
        <tbody>
        {% for emp in emp_list.object_list %}
            <tr><td><a href="http://10.1.0.90:8080/singleEmployee/{{emp.id}}">{{emp.userName}}</a></td></tr>
        {% endfor %}
        </tbody>
    </table>
</body>

单击“Some-Label”的单元格将按升序/降序切换排序。

此外,它还有一个用于处理分页的插件。看看这个link 的演示。

【讨论】:

  • 非常适合我的需要..非常感谢gladys
  • 我有更多疑问.. 我是这样给出的:" 过滤的员工列表 " ,即只有 1 张图片完成了这两个功能。我们可以让它像它首先显示一个向上箭头一样吗?单击它以升序显示列表,并且图像变为向下箭头。单击它以降序显示。 ?
  • 我觉得很混乱。标题中的箭头指示列的排序方式,这就是为什么它在按降序排序时显示向下箭头,否则显示向上箭头的原因。你想扭转它吗?它并不优雅,但如果你交换它使用的箭头图像,它就会起作用,即。将 sort_desc.gif 重命名为 sort_asc.gif,反之亦然。
  • no..那不是我的意思..我的意思是我需要显示两个箭头(图像)..现在只给出了 1 个图像,因此对于升序和降序排序。没有图像更改。但是我想显示一个向上箭头表示上升,当我再次单击时,它应该将图像更改为向下箭头,而下降功能应该可以工作。这就是我现在给出图像的方式:
  • {% for emp in emp_list.object_list %} {% endfor %}
    过滤的员工列表
    10.1.0.90:8080/singleEmployee{{emp.id }}?choices={{val2}}&textField={{val3}}&flag=True ">{{emp.userName}}
猜你喜欢
  • 2016-10-18
  • 2018-05-03
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多