【问题标题】:Django regex pattern for URL involving ?q= search query not working涉及 ?q= 搜索查询的 URL 的 Django 正则表达式模式不起作用
【发布时间】:2015-05-25 01:04:58
【问题描述】:

我有一个用作搜索工具的 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 这样的 URL

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')

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

【问题讨论】:

  • 应该是?q=而不是urls.py中的?p=
  • @RafaelCardoso 是的!那是一个错字
  • 我认为它应该是一个反斜杠来逃避正则表达式中的问号,^\?q=&lt;query&gt;$ 或者可能是^/\?q=&lt;query&gt;$。我不熟悉python,但可能是错的。
  • @chris85 我都试过了。它似乎不起作用。
  • 查看了文档,docs.djangoproject.com/en/1.8/topics/http/urls,所以可能是^\?q=(.*?(?:&amp;|$))。如果没有,我不确定我是否会将其留给有经验的人。

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


【解决方案1】:

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

【讨论】:

  • 您能否详细说明一下。您如何通过request.GET['q'] 访问它。
  • 我不知道还能告诉你什么。在视图中使用该代码,它将为您提供q 参数的值。
  • 在我看来,我已经在这样做了。但它似乎不起作用。
  • “似乎不起作用”不是很有用 - 到底发生了什么?你得到什么错误?
  • 它重定向到索引页面而不是显示结果。在我的退货声明return render(request, 'search.html', {'results': new_results, 'q': q}) 中,我传递了q。我可以显示结果的唯一方法是将url(r'^$', 'searchengine.views.index', name='home') 更改为url(r'^$', 'searchengine.views.search', name='search'),这再次将主页更改为搜索页面,因为它是根网址。
【解决方案2】:

您可能在捕获查询参数时遇到问题。

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

?q=&lt;query&gt; 可能会导致问题。

尝试以下操作:

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

不要在^ 之后使用/ 并转义?,因为它是正则表达式文字。还使用名称组 (?P&lt;query_search&gt;\w+)) 允许您使用给定的参数名称将捕获的部分传递到您的视图。您可以通过更改\w+来更改捕获标准

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

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 2016-07-21
    • 2013-09-23
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多