在django中按升序/降序对已过滤列表进行排序
我已经使用Django创建了一个员工管理系统。我已经完成了一个过滤方法,它基于从下拉菜单和文本输入中选择的一个选项。过滤工作正常。在第一页上,它给出了可以按升序和降序显示的整个员工名单。在同一页面上给出了过滤方法。过滤的数据显示在另一页中。现在我想在过滤的数据页面上放一个按钮,点击该按钮以升序/降序显示数据。我已经编写了一个单独的函数,用于在完整员工列表的视图中升序和降序。它如何用于此功能。我会在这里粘贴我的代码。由于我是django编程新手,请帮助我找到解决方案。
我已经给出了2个单独的图像升序和降序。我想这样:点击1图像列表中的升序;并点击其他图片按降序排列。在django中按升序/降序对已过滤列表进行排序
筛选()
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
<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%}
处理视图级别排序的另一种方法是在模板上进行排序。出于这个原因,您可能需要结账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 – 2011-03-18 05:25:14
我有一个更多的疑问..我给它是这样的:“ ”,即只有1个图像同时具有这两个功能。我们能不能让它像第一次显示的那样。在点击它时按升序显示列表,图像变为向下箭头。点击后按降序显示。 ? –
2011-03-18 05:30:54
过滤员工列表
我觉得很困惑。标题中的箭头表示该列是如何排序的,这就是为什么当按降序排列时显示向下箭头,否则显示向上箭头。你想扭转它?它不是优雅的,但它会工作,如果你交换它使用的箭头图像,即。将sort_desc.gif重命名为sort_asc.gif,反之亦然。 – gladysbixly 2011-03-18 15:52:45
我不知道我得到的问题,但如果要排序应用于过滤的对象,你可能需要添加某种缓存的(从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
现在你的排序方法可以得到最初通过过滤器的值。您也可以将它们作为获取参数添加到视图网址中。
尝试这个我得到一个错误'全球名称val2未定义'? – 2011-03-17 06:13:10
添加'val2 ='''你在哪里做val3 – 2011-03-18 03:25:16
非常感谢Mike ..:) – 2011-03-18 05:26:01
如果您希望按照即时排序的方式排序表格而不生成新页面,请查看JS。 – KyleWpppd 2011-03-17 11:43:44