编辑:我还尝试了iregex,发现它的行为方式与下面的图标相同。
form_search = FormTest.objects.filter(name__iregex=rf"{new_data}")我遇到了一个问题,如果在项目中运行相同的查询,与在该项目的shell中运行相同的查询时,其行为会有所不同。
我在项目的数据库(FormTest)中创建了一个示例表。FormTest表包含一个名为"name“的字段,我在其中添加了"Mike”、"Mike Smith“、"John”、"Jonathan“等值。
然后,我创建了一个简单的表单来使用图标搜索表中的名称:
if request.method == 'POST':
input_form = FormClassSearch(request.POST)
if input_form.is_valid():
new_data = input_form.cleaned_data
new_data = str(new_data['name'])
form_search = FormTest.objects.filter(name__icontains=new_data)
form_search_q =\
FormTest.objects.filter(name__icontains=new_data).query当我使用表单搜索"Mike“时,它返回"Mike”和"Mike Smith“。但是,如果我搜索"Mike Smith“,它将不返回任何内容。当我试图找到"Jonathan“时,出现了一个奇怪的问题。如果我搜索"Jo“,它会同时返回"John”和"Jonathan“。如果我试着搜索“乔恩”“乔娜”"Jonathan“,它不返回任何内容。
为了确保我正确编写了查询,我启动了manage.py外壳:
>>> c = 'mike smith'
>>> print(c)
mike smith
>>> a = FormTest.objects.filter(name__icontains=c)
>>> a.exists()
True
>>> len(a)
1
>>> for item in a:
... print(item.name)
...
Mike Smith
>>> b = FormTest.objects.filter(name__icontains=c).query
>>> print(b)
SELECT "workout_formtest"."id", "workout_formtest"."name",
"workout_formtest"."dob", "workout_formtest"."number", "workout_formtest"."number2"
FROM "workout_formtest" WHERE UPPER("workout_formtest"."name"::text)
LIKE UPPER(%mike smith%)我确认了来自.query的SQL匹配(外壳输出与应用程序输出)。我还对模板进行了编码,以打印搜索词,以确保输入被正确传递。
有没有人知道我做错了什么,或者为什么应用程序没有按照预期运行?我在settings.py中只有一个数据库-- Postgresql DB。我创建的用于向表中添加数据的表单可以完美地工作。
发布于 2020-12-25 02:18:15
已解决:
我不知道确切的原因,但我相信这与QuerySets懒惰的事实有关。最初,直到在模板上迭代查询集时才对其求值。我的解决方案是遍历视图中的查询集,并将结果附加到一个列表中:
def formsearchpage(request):
...
query_list = []
if request.method == 'POST':
input_form = ClassSearchForm(request.POST)
if input_form.is_valid():
new_data = input_form.cleaned_data
new_data = str(new_data['name'])
form_search = FormTest.objects.filter(name__iregex=rf"{new_data}")
count = len(form_search)
message = "Your input " + new_data
if count == 1:
message = 'One Match Found on ' + new_data
for item in form_search:
query_list.append(item.name)
if count >= 2:
message = 'More than one match found on ' + new_data
for item in form_search:
query_list.append(item.name)
...关键是:
for item in form_search:
query_list.append(item.name)然后将query_list传递给模板,模板将显示它:
{% if query_list %}
{% for i in query_list %}
<p>{{ i }}</p>
{% endfor %}
{% endif %}现在,当我呈现模板时,迭代“query_list”的循环显示预期的数据,而迭代原始QuerySet (在视图中创建的“form_search”对象)的旧循环不显示预期的数据。
https://stackoverflow.com/questions/65411240
复制相似问题