Django中的过滤

1 投票
3 回答
1935 浏览
提问于 2025-04-16 12:58

我正在尝试实现一个简单的过滤功能,这个功能是根据从下拉菜单中选择的选项和一个文本框的内容来筛选数据。下拉菜单里有一些选项,比如姓名、职位和员工编号(这些都是数据库中的字段)。然后有一个文本框,用户可以在这里输入与下拉菜单中选择的职位相关的值。例如:如果我在下拉菜单中选择“职位”,然后在文本框中输入“软件工程师”,我希望能显示所有职位是“软件工程师”的用户。如果我在下拉菜单中选择“姓名”,并在文本框中输入“约翰”,我希望能显示所有名字是“约翰”的用户。我该如何在Django中实现这个功能?我对Django还很陌生,所以请帮我一下。我会把我的代码贴在这里。

VIEWS.PY

def filter(request):
    val=request.POST.get('designation')      
    val2=request.POST.get('choices')
    val3=request.POST.get('textField')
    print val
    print val2,val3
    if val2=='Designation':       
        newData = EmployeeDetails.objects.filter(designation=request.POST.get('choices'))
        print val2
    elif val2=='Name':
        newData = EmployeeDetails.objects.filter(userName=request.POST.get('choices'))
        print val2
    elif val2=='EmployeeID':
        newData = EmployeeDetails.objects.filter(employeeID=request.POST.get('choices'))
        print val2    
    elif val2=='Project':
        newData = EmployeeDetails.objects.filter(project=request.POST.get('choices'))  
        print val2 
    elif val2=='DateOfJoin':
        newData = EmployeeDetails.objects.filter(dateOfJoin=request.POST.get('choices'))  
        print val2
    else:
        print "Data Not Found"       

    return render_to_response('filter.html',{'newData':newData,'val2':val2})      

HTML

<form action="http://10.1.0.90:8080/filter/" method="POST">
Filter By: 
<select name="choices" onsubmit="document.forms[0].submit()" >
    <option value="">Select A Choice</option>
    <option value="Name">Name</option> 
    <option value="Designation" >Designation</option>
    <option value="EmployeeID" >EmployeeID</option>
    <option value="Project" >Project</option>
    <option value="DateOfJoin" >Date Of Join</option>   
</select>
<input type="text" name="textField">
<input type="submit" value="Go">
</form>
<table>
{%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><td>
{%endfor%}
</table></h4>
{%for data in newData%}
{{ data.userName}}<br>
{%endfor%} 

MODELS.PY

class EmployeeDetails(models.Model):
    userName = models.CharField(max_length=200)
    designation = models.CharField(max_length=200)
    employeeID = models.IntegerField()
    contactNumber = models.CharField(max_length=200)
    project = models.CharField(max_length=200)
    dateOfJoin=models.TextField()

3 个回答

0

为了补充Yuji的回答,我建议你了解一下kwargs和Q表达式。这些内容会帮助你进行动态查询。

4

我在你其他的帖子里给出了答案:

first, make your choice values EXACTLY the field names you want to search.

<select name="choices" onsubmit="document.forms[0].submit()" >
    <option value="">Select A Choice</option>
    <option value="userName">Name</option> 
    <option value="designation" >Designation</option>
    <option value="employeeID" >EmployeeID</option>
    <option value="project" >Project</option>
    <option value="dateOfJoin" >Date Of Join</option> 
</select>

然后,在你的视图里,使用关键字扩展把choices提供的字符串变成一个关键字参数。

if request.GET.get('choices'):
    # prevent query on field ''
    newdata= EmployeeDetails.objects.filter(**{request.GET.get('choices'): \
          request.GET.get('textField')})

    # this is the equivalent of running 
    #     EmployeeDetails.objects.filter(keyword=request.GET['textField'])
0
def filter(request):
    val=request.POST.get('designation')      
    val2=request.POST.get('choices')
    val3=request.POST.get('textField')
    print val
    print val2,val3
    if val2=='Designation':

        newData = EmployeeDetails.objects.filter(designation=request.POST.get('textField'))
        print val2
    elif val2=='Name':
        newData = EmployeeDetails.objects.filter(userName=request.POST.get('textField'))
        print val2
    elif val2=='EmployeeID':
        newData = EmployeeDetails.objects.filter(employeeID=request.POST.get('textField'))
        print val2    
    elif val2=='Project':
        newData = EmployeeDetails.objects.filter(project=request.POST.get('textField'))  
        print val2 
    elif val2=='DateOfJoin':
        newData = EmployeeDetails.objects.filter(dateOfJoin=request.POST.get('textField'))  
        print val2
    else:
        print "Data Not Found"       

    return render_to_response('filter.html',{'newData':newData,'val2':val2})

这解决了我的问题

撰写回答