FieldError: 无法将关键字'TextField'解析为字段
我正在为我的Django应用程序做一个过滤功能。我在数据库里有一些字段,比如用户名、职位、员工ID等等。现在我想做一个过滤器,里面有一个下拉菜单,显示所有的字段(比如名字、职位、员工ID等),还有一个文本框用来输入一些文字。过滤的结果应该根据下拉菜单选择的内容和文本框里输入的数据来进行。但是在这个过程中,我遇到了一个错误:FieldError at /filter/ 无法将关键字'textField'解析为字段。可选项有:contactNumber, dateOfJoin, designation, employeeID, id, project, userName 我会把我的HTML和views.py代码贴在这里。请帮我解决这个问题。
<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="Date Of Join" >Date Of Join</option>
</select>
<input type="text" name="textField">
<input type="submit" value="Go">
</form>
{%for data in newData%}
{{ data.userName}}<br>
{%endfor%}
这是我的VIEWS.PY
def filter(request):
val2=request.POST.get('choices')
val3=request.POST.get('textField')
print val2,val3
newData = EmployeeDetails.objects.filter(choices=request.POST.get('choices'),textField=request.POST.get('textField'))
return render_to_response('filter.html',{'newData':newData,'val2':val2,'val3':val3})
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()
我对Django还很陌生。请帮我解决这个问题。
3 个回答
如果你没有一个叫“textField”的字段,你就无法对“EmployeeDetails”模型进行筛选。你只能根据现有的字段来筛选“EmployeeDetails”模型,比如:“contactNumber(联系电话)、dateOfJoin(入职日期)、designation(职位)、employeeID(员工编号)、id(ID)、project(项目)、userName(用户名)”。
=)
如果我理解你想做的事情,你是在错误地使用过滤器。要根据一个动态的字段(val2)和给定的查询(val3)进行过滤,可以试试下面的代码。
kwargs = {}
kwargs[val2] = val3
newData = EmployeeDetails.objects.filter(**kwargs)
在你的代码中,选项的值需要和模型对应,这样才能正常工作。
你为什么会期待Django能够神奇地把字段名映射到你在模板中指定的名称呢?比如说,你在<select>
选项中列出的那些项,在你的模型里根本没有对应的字段。
我觉得这个错误信息非常清楚:
FieldError at /filter/ 无法将关键字 'textField' 解析为字段。可选项有:contactNumber, dateOfJoin, designation, employeeID, id, project, userName
你的模型里没有textField
这个字段,但你却试图根据它来过滤数据。
想象一下SELECT textField FROM mytable
-- textField
根本就不存在。
... 还有一个文本区域用来输入一些文本。
至于如何解决你的问题,你有几个方面需要注意。你试图在选项中指定的特定字段上进行查找,但选项和你的字段之间并没有关系。
为了让自己更轻松,至少把你的<option>
标签的值设置为字段名。
<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>
if request.GET.get('choices'):
# prevent query on field ''
EmployeeDetails.objects.filter(**{request.GET.get('choices'): \
request.GET.get('textField')})