我正在尝试为我的django应用程序执行过滤方法。我在db中有一些字段,如userName,names,employeeID等。现在我想做一个过滤;其中有下拉列表显示所有字段(名称,名称,employeeID等)和用于输入某些文本的文本区域。应根据下拉选项选择和在文本区域中输入的数据进行过滤。执行此操作时出现此错误: / error /中的FieldError 无法将关键字“textField”解析为字段。选项包括:contactNumber,dateOfJoin,names,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很新。请帮我解决这个问题
答案 0 :(得分:3)
为什么期望django能够将字段名称神奇地映射到您在模板中指定的名称?例如,您的模型中没有任何内容称为您在<select>
选项中列出的任何项目。
我发现错误非常自我解释:
> / filter /中的FieldError无法解析 关键字'textField'到字段中。 选择是:contactNumber, dateOfJoin,names,employeeID, id,project,userName
您的模型中没有textField
字段,但您尝试对其进行过滤。
想象一下SELECT textField FROM mytable
- textField
就不存在了。
...以及用于输入一些文本区域的文本区域 文本。
至于修复你的问题,你有几个。您正在尝试对选项中指定的特定字段执行查找,但Choices与您的字段之间没有任何关系。
为了方便您自己,至少将<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')})
答案 1 :(得分:2)
如果我理解你想要做什么,那么你使用过滤器的方式是错误的。要使用给定查询(val3)过滤动态发布字段(val2),请尝试。
kwargs = {}
kwargs[val2] = val3
newData = EmployeeDetails.objects.filter(**kwargs)
您的代码中的选项值需要映射模型才能生效。
答案 2 :(得分:1)
如果您没有名为“textField”的字段,则无法过滤“EmployeeDetails”模型。您只能使用以下可用字段过滤“EmployeeDetails”模型:“contactNumber,dateOfJoin,designation,employeeID,id,project,userName”。
=)