我有一个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}} % <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')
但这会使着陆页呈现搜索页面而不是主页,这是错误的。
答案 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在视图中执行此操作的答案