首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django图标在web和shell上的行为不同。

Django图标在web和shell上的行为不同。
EN

Stack Overflow用户
提问于 2020-12-22 23:18:48
回答 1查看 37关注 0票数 0

编辑:我还尝试了iregex,发现它的行为方式与下面的图标相同。

代码语言:javascript
复制
form_search = FormTest.objects.filter(name__iregex=rf"{new_data}")

我遇到了一个问题,如果在项目中运行相同的查询,与在该项目的shell中运行相同的查询时,其行为会有所不同。

我在项目的数据库(FormTest)中创建了一个示例表。FormTest表包含一个名为"name“的字段,我在其中添加了"Mike”、"Mike Smith“、"John”、"Jonathan“等值。

然后,我创建了一个简单的表单来使用图标搜索表中的名称:

代码语言:javascript
复制
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外壳:

代码语言:javascript
复制
>>> 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。我创建的用于向表中添加数据的表单可以完美地工作。

EN

回答 1

Stack Overflow用户

发布于 2020-12-25 02:18:15

已解决:

我不知道确切的原因,但我相信这与QuerySets懒惰的事实有关。最初,直到在模板上迭代查询集时才对其求值。我的解决方案是遍历视图中的查询集,并将结果附加到一个列表中:

代码语言:javascript
复制
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)
...

关键是:

代码语言:javascript
复制
for item in form_search:
    query_list.append(item.name)

然后将query_list传递给模板,模板将显示它:

代码语言:javascript
复制
{% if query_list %}
{% for i in query_list %}
<p>{{ i }}</p>
{% endfor %}
{% endif %}

现在,当我呈现模板时,迭代“query_list”的循环显示预期的数据,而迭代原始QuerySet (在视图中创建的“form_search”对象)的旧循环不显示预期的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65411240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档