Django字段错误-无法将关键字“xxxx”解析为字段

Django字段错误-无法将关键字“xxxx”解析为字段,django,post,Django,Post,我正在尝试做一些相当简单的事情。允许用户在文本字段中键入搜索词,然后从下拉框中选择搜索字段。但我似乎得到了上面的错误 模板 <form method='post' action=''> <input type='text' id='searchterm'> <select id='searchfield'> <option value='username'>Username</option> <option val

我正在尝试做一些相当简单的事情。允许用户在文本字段中键入搜索词,然后从下拉框中选择搜索字段。但我似乎得到了上面的错误

模板

<form method='post' action=''>
<input type='text' id='searchterm'>
<select id='searchfield'>
    <option value='username'>Username</option>
    <option value='status'>Status</option>
</select>
</form>
模型

class User(models.Model):
    username = models.CharField(max_length=50)
    status = models.CharField(max_length=50)
也许在我看来我做错了什么


非常感谢您的帮助。

我相信问题可能在于您如何要求User.objects搜索数据。由于您试图将动态关键字传递到过滤器中,因此可能必须将其作为**kwargs传递,而不是直接作为过滤器参数传递。我怀疑Django正在读取searchfield作为要搜索的文本关键字字段名,而不是读取其值

此链接可能会提供更清晰的可能解决方案。

下面是一个示例,说明如何使用当前代码设置实现动态字段

一如既往,请清理并限制用户输入,否则恶意用户可能会暴露除用于过滤的敏感数据以外的敏感数据。注意:这尚未在本地进行测试


我相信问题可能在于如何要求User.objects搜索数据。由于您试图将动态关键字传递到过滤器中,因此可能必须将其作为**kwargs传递,而不是直接作为过滤器参数传递。我怀疑Django正在读取searchfield作为要搜索的文本关键字字段名,而不是读取其值

此链接可能会提供更清晰的可能解决方案。

下面是一个示例,说明如何使用当前代码设置实现动态字段

一如既往,请清理并限制用户输入,否则恶意用户可能会暴露除用于过滤的敏感数据以外的敏感数据。注意:这尚未在本地进行测试


请发布一个完整的回溯。请发布一个完整的回溯。您是否意识到这将允许任何恶意用户从您的模型中搜索任何字段,遍历关系,并可能公开属于私有的数据?请至少提到,如果使用这样的设置,则需要进行验证。Thomas,提供的代码片段只是为了举例说明baz00r如何使用传入的动态参数实现kwargs。我希望从客户端传递的任何数据总是经过清理、约束和验证,本例中没有包括这些,以避免陷入困境。感谢您注意到,如果代码不安全,可能会发生攻击。我将更新代码段以避免混淆。谢谢你更新并更新了你的答案。只是把它放在那里,因为使用ORM通常意味着我们希望安全性、验证和消毒开箱即用,这在本例中是不存在的;嘿,蒂姆,非常感谢你的回复。我理解你的意思,我不熟悉args/kwargs背后的理论。经过一点阅读,它开始变得更有意义。您的解决方案中我唯一不完全理解的部分是'kwargs={{{0}{1}'。formatsearchfield'icontains':searchterm}。你能更详细地向我解释一下吗?我不明白{0}{1}在做什么?再次感谢您迄今为止的帮助。baz00r,没问题!在python中,有一系列快捷方式可以帮助连接或替换字符串的连接。将变量数据注入字符串的快捷方式和更安全的方法可能是:kwargs={{0}{1}。formatsearchfield,'icontains':searchterm}。在许多情况下,您可能会看到人们使用:new_string=%s_\%s%searchfield,“icontains”最终结果应该是相同的,只是优雅的方式不同而已。您是否意识到这将允许任何恶意用户从您的模型中搜索任何字段,遍历关系,并可能公开属于私有的数据?请至少提到,如果使用这样的设置,则需要进行验证。Thomas,提供的代码片段只是为了举例说明baz00r如何使用传入的动态参数实现kwargs。我希望从客户端传递的任何数据总是经过清理、约束和验证,本例中没有包括这些,以避免陷入困境。感谢您注意到,如果代码不安全,可能会发生攻击。我将更新代码段以避免混淆。谢谢你更新并更新了你的答案。只是把它放在那里,因为使用ORM通常意味着我们希望安全性、验证和消毒开箱即用,这在本例中是不存在的;嘿,蒂姆,非常感谢你的回复。我理解你的意思,我不熟悉args/kwargs背后的理论。经过一点阅读,它开始变得更有意义。您的解决方案中唯一我不完全理解的部分是'kwargs={{{0}{1}'。formatsearchfield'icontains':se
archterm}'。你能更详细地向我解释一下吗?我不明白{0}{1}在做什么?再次感谢您迄今为止的帮助。baz00r,没问题!在python中,有一系列快捷方式可以帮助连接或替换字符串的连接。将变量数据注入字符串的快捷方式和更安全的方法可能是:kwargs={{0}{1}。formatsearchfield,'icontains':searchterm}。在许多情况下,您可能会看到人们使用:new_string=%s_\%s%searchfield,“icontains”最终的结果应该是一样的,只是优雅的方式不同而已。
class User(models.Model):
    username = models.CharField(max_length=50)
    status = models.CharField(max_length=50)
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)