Python 涉及?q=搜索查询不工作的URL的Django正则表达式模式

Python 涉及?q=搜索查询不工作的URL的Django正则表达式模式,python,regex,django,model-view-controller,django-views,Python,Regex,Django,Model View Controller,Django Views,我有一个Django应用程序作为搜索工具。我面临的问题是无法通过url.py 视图.py def search(request): new_results = [] error = True if "q" in request.GET: query = request.GET["q"].strip() results = graph_search.main(query) for result in results:

我有一个Django应用程序作为搜索工具。我面临的问题是无法通过
url.py

视图.py

def search(request):
    new_results = []
    error = True
    if "q" in request.GET: 
        query = request.GET["q"].strip()
        results = graph_search.main(query)
        for result in results:
            result[3] = result[3].decode('unicode_escape').encode('ascii', 'ignore')
            new_results.append(result)
        new_results = list(reversed(sorted(new_results, key=itemgetter(4))))
        return render(request, 'search.html',
                      {'results': new_results, 'query': query})
    return render(request, 'search.html', {'error': error})
url.py

def search(request):
    new_results = []
    error = True
    if "q" in request.GET: 
        query = request.GET["q"].strip()
        results = graph_search.main(query)
        for result in results:
            result[3] = result[3].decode('unicode_escape').encode('ascii', 'ignore')
            new_results.append(result)
        new_results = list(reversed(sorted(new_results, key=itemgetter(4))))
        return render(request, 'search.html',
                      {'results': new_results, 'query': query})
    return render(request, 'search.html', {'error': error})
Rendering index.html-工作正常
url(r'^$,'searchengine.views.index',name='home'),

Rendering search.html-工作正常
url(r'^search',searchengine.views.search',name='search'),

呈现搜索结果-不起作用,而是呈现索引页

url(r'^/?q=$'、'searchengine.views.search',name='search'),

有人能帮我找到正确的正则表达式模式吗?我需要在Django中使用它来呈现像
http://foo.com/?q=emily

search.html

<p>You searched for: <strong>{{ query }}</strong></p>

{% if results %}
    <div class="container">
    <div class="row">
        <div class="timeline-centered">
        {% for result in results %}
             <article class="timeline-entry">
                <div class="timeline-entry-inner">
                    <div class="timeline-icon bg-info">
                        <i class="entypo-feather"></i>
                    </div>
                    <div class="timeline-label">
                        <strong>Statement: </strong>{{ result.3 }}<br>
                        <strong>Doc: </strong>{{ result.0 }} <br>
                        <strong>Context: </strong>{{ result.1 }} <br>
                        <strong>Related: </strong>{{ result.2 }} <br>
                        <strong>Confidence: </strong>{{ result.4}} &#37 <br>
                    </div>
                </div>
            </article>
        {% endfor %}
        </div>
    </div>
    </div>

{% else %}
    <p>No results matched your search criteria.</p>
您搜索的
{{{query}

{%if结果%} {结果中的结果为%} 语句:{{result.3}}
Doc:{{result.0}}
上下文:{{result.1}}
相关:{{result.2}}
信心:{{result.4}}%
{%endfor%} {%else%} 没有与您的搜索条件匹配的结果

我能让它工作的唯一方法就是改变

url(r'^$,'searchengine.views.index',name='home')

url(r'^$,'searchengine.views.search',name='search')


但这会使登录页呈现搜索页而不是主页,这是错误的。

Django不会在URL模式中捕获查询字符串。关闭它并通过
请求访问它。在视图中获取['q']

可能在捕获查询参数方面存在问题

url(r'^/?q=<query>$', 'searchengine.views.search', name='search'),
url(r'^/?q=$,'searchengine.views.search',name='search'),
?q=
可能是导致问题的原因

请尝试以下操作:

 url(r'^\?q=(?P<query_search>\w+)$', 'searchengine.views.search', name='search'),
url(r'^\?q=(?P\w+)$,'searchengine.views.search',name='search'),
不要在
^
之后使用
/
和转义
,因为它是正则表达式文本。还可以使用名称组(
?P\w+
)将捕获的零件传递给具有给定参数名称的视图。您可以通过更改
\w+


但另一方面,在URL中捕获
GET
参数不是正确的方法。查看@DanielRoseman在视图中的答案,了解如何在url.py中执行此操作

是否应该是
?q=
而不是
?p=
?@RafaelCardoso是的!这是一个输入错误,我认为应该是一个反斜杠来避开正则表达式中的问号,
^\?q=$
或者可能是
^/\?q=$
。我对python不熟悉,所以可能是错的。@chris85我两个都试过了。它似乎不起作用。查看文档,可能是
^\?q=(*?(?:&$)
。如果没有,我不确定我会把它留给有经验的人。你能详细说明一下吗。如何通过
请求访问它。准确地获取['q']
。我不知道还能告诉你什么。在视图中使用该代码,它将为您提供
q
参数的值。我已经在视图中这样做了。但它似乎不起作用。“似乎不起作用”不是很有用——到底发生了什么?您会遇到什么错误?它会重定向到索引页,而不是显示结果。在我的return语句
returnrender(请求'search.html',{'results':new_results'q':q})
中,我传递的是
q
。我获得显示结果的唯一方法是将
url(r'^$,'searchengine.views.index',name='home')
更改为
url(r'^$,'searchengine.views.search',name='search')
,这再次将主页更改为搜索页面,因为它是根url。