2011-03-17 92 views
0

我已經使用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&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%} 
+1

如果您希望按照即時排序的方式排序表格而不生成新頁面,請查看JS。 – KyleWpppd 2011-03-17 11:43:44

回答

1

處理視圖級別排序的另一種方法是在模板上進行排序。出於這個原因,您可能需要結賬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的演示。

+0

這是完美的我的需要..感謝很多gladys – 2011-03-18 05:25:14

+0

我有一個更多的疑問..我給它是這樣的:「過濾員工列表」,即只有1個圖像同時具有這兩個功能。我們能不能讓它像第一次顯示的那樣。在點擊它時按升序顯示列表,圖像變爲向下箭頭。點擊後按降序顯示。 ? – 2011-03-18 05:30:54

+0

我覺得很困惑。標題中的箭頭表示該列是如何排序的,這就是爲什麼當按降序排列時顯示向下箭頭,否則顯示向上箭頭。你想扭轉它?它不是優雅的,但它會工作,如果你交換它使用的箭頭圖像,即。將sort_desc.gif重命名爲sort_asc.gif,反之亦然。 – gladysbixly 2011-03-18 15:52:45

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 

現在你的排序方法可以得到最初通過過濾器的值。您也可以將它們作爲獲取參數添加到視圖網址中。

+0

嘗試這個我得到一個錯誤'全球名稱val2未定義'? – 2011-03-17 06:13:10

+0

添加'val2 ='''你在哪裏做val3 – 2011-03-18 03:25:16

+0

非常感謝Mike ..:) – 2011-03-18 05:26:01