我正在尝试做一些相当简单的事情。允许用户在searchterm中键入文本字段,然后从下拉框中选择搜索字段。但我似乎得到了上述错误。
模板
<form method='post' action=''>
<input type='text' id='searchterm'>
<select id='searchfield'>
<option value='username'>Username</option>
<option value='status'>Status</option>
</select>
</form>
查看
def existing(request):
if request.method == 'POST':
searchterm = request.POST['searchterm']
searchfield = request.POST['searchfield']
records = User.objects.filter(searchfield=searchterm)
else:
records = User.objects.all()
return render_to_response('gpon_table.html',locals())
模型
class User(models.Model):
username = models.CharField(max_length=50)
status = models.CharField(max_length=50)
也许我在视图中做错了。
任何帮助都非常感激。
答案 0 :(得分:5)
我认为问题可能在于您如何要求User.objects搜索数据。由于您尝试将动态关键字传入过滤器,因此可能必须将其作为**kwargs
传递,而不是直接作为过滤器参数传递。我怀疑Django正在阅读“searchfield”作为要搜索的文字关键字字段名称而不是读取其值。
此链接可能会更清晰地说明可能的解决方案。 https://stackoverflow.com/a/659419/1011998
以下是如何使用当前代码设置实现动态字段的示例。
与往常一样,清理并限制用户输入,否则恶意用户可能会暴露除用于过滤的敏感数据之外的敏感数据。 (注意:这尚未在本地测试)
searchterm = request.POST.get('searchterm')
searchfield = request.POST.get('searchfield', 'username')
# Better to replace/populate this with form field choices
available_fields = ['username', 'status']
if not searchfield in available_fields:
searchfield = 'username'
kwargs = {'{0}__{1}'.format(searchfield, 'icontains'): searchterm}
records = User.objects.filter(**kwargs)