我正在尝试做一些相当简单的事情.允许用户在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>
Run Code Online (Sandbox Code Playgroud)
视图
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())
Run Code Online (Sandbox Code Playgroud)
楷模
class User(models.Model):
username = models.CharField(max_length=50)
status = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)
也许我在视图中做错了什么.
任何帮助非常感谢.
我相信问题可能在于你如何要求User.objects搜索数据.由于您尝试将动态关键字传递到过滤器中,因此您可能必须将其**kwargs作为过滤器参数直接传递.我怀疑Django正在阅读"searchfield"作为要搜索的文字关键字字段名称而不是读取其值.
此链接可能会更清晰地说明可能的解决方案. /sf/answers/46159361/
以下是如何使用当前代码设置实现动态字段的示例.
与往常一样,清理并限制用户输入,否则恶意用户可能能够暴露除用于过滤的敏感数据之外的敏感数据.(注意:这尚未在本地测试)
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)
Run Code Online (Sandbox Code Playgroud)