[英]Sorting a filtered list in ascending/descending order in django
我使用Django創建了一個Employee管理系統。 我已經在其中完成了一個過濾方法,它基於從下拉菜單和文本輸入中選擇的選項。 過濾工作正常。 在第一頁上,它給出了整個員工列表,可以按升序和降序顯示。 在同一頁面上給出了過濾方法。 過濾后的數據顯示在另一頁中。 現在我想在過濾后的數據頁面上給出一個按鈕,單擊該按鈕會以升序/降序顯示數據。 我已經為完整的員工列表在視圖中編寫了一個單獨的升序和降序函數。 它如何用於此功能。 我會在這里粘貼我的代碼。 請幫我找一個解決方案,因為我是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
<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%}
我不確定我是否得到了這個問題,但是如果你想將排序應用於過濾的對象,你可能想要添加某種緩存(不同於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
現在,您的排序方法可以獲取最初傳遞的過濾器值。 您也可以選擇將它們作為get參數添加到視圖URL中。
在視圖級別處理排序的另一種方法是在模板上執行此操作。 因此,您可能需要簽出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”單元格將按升序/降序切換排序。
此外,它還有一個用於處理分頁的插件。 查看演示的此鏈接 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.