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

时间:2015-05-25 01:04:58

标签: python regex django model-view-controller django-views

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

获取搜索结果页面

views.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})

urls.py

渲染index.html - 正常工作
url(r'^$', 'searchengine.views.index', name='home'),

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

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

url(r'^/?q=<query>$', '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>

我能让它发挥作用的唯一方法就是改变

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

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

但这会使着陆页呈现搜索页面而不是主页,这是错误的。

2 个答案:

答案 0 :(得分:2)

Django不捕获URL模式中的查询字符串。将其关闭并通过视图中的request.GET['q']访问它。

答案 1 :(得分:0)

可能你遇到了捕获查询参数的问题。

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

?q=<query>可能会导致问题。

请尝试以下操作:

 url(r'^\?q=(?P<query_search>\w+)$', 'searchengine.views.search', name='search'),

请勿在{{1​​}}后使用/并转义^,因为它是正则表达式字面值。同样使用名称组(?)允许您使用给定的参数名称将捕获的部件传递到视图。您可以通过更改?P<query_search>\w+)

来更改捕获条件

但另一方面,在网址中捕获\w+参数并不是正确的方法。请参阅@ DanielRoseman在视图中执行此操作的答案