反向 *view* 没有找到参数 '('',)'
Reverse for *view* with arguments '('',)' not found
我正在尝试创建一个简单的搜索表单(按邮政编码搜索),但很难将用户的输入传递给视图:
<form action="{% url 'search_results' query %}" method="post">
<div>
{% csrf_token %}
<input type = 'text' name = 'query' placeholder="Zip Code" />
<button type="submit" name="button">Find Jobs</button>
</div>
</form>
urls.py:
path('search_results/<str:query>', job_views.search_results, name = 'search_results'),
views.py:
def search_results(request, query):
query = request.GET['query']
return HttpResponse(query) # just trying to see if this view has access to 'query'
我不确定这里发生了什么。这个returns
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'search_results' with a
rguments '('',)' not found. 1 pattern(s) tried: ['search_results\/(?P<que
ry>[^/]+)$']
感谢您的帮助!
模板不是这样工作的。
模板用于生成响应,然后返回给请求者。在这种情况下,您的主视图会生成一个 HTML 文档,该文档将传递给浏览器。该文档包含 url
模板标记的结果,该标记甚至在用户看到之前就已确定。模板标签不是引用 DOM 对象状态的方法!
相反,您通常应该有一个稳定的 URL 视图,不随查询而变化。通常,您将从表单数据表示中提取查询文本 - 在这里,它是 request.POST
类似字典的对象或(通常更好)绑定到 POST
数据的 Django 表单,因为您的表单使用 method="post"
.
可以使用 Javascript 编辑 DOM 并在提交之前更改您的表单操作以包含查询文本,但这不是处理表单的常用模式。模板标签永远不会这样做 - 它们仅用于生成响应。
在您的表单中,在行:action="{% url 'search_results' query %}"
,您正试图将 query
传递给 url 标记,这样就可以了 if 查询有一个值,但在您的情况下查询未定义。
相反,您的表格应该如下所示:
<form action="{% url 'search_results' %}" method="GET">
<div>
<input type = "text" name = "zip_code" placeholder="Zip Code" />
<button type="submit" name="button">Find Jobs</button>
</div>
</form>
请注意,我从您的 url 标签中删除了 query
,并将方法更改为 GET
,详情请参阅 this question。
现在更改您的路径:
path('search_results', job_views.search_results, name = 'search_results')
您不需要在路径中添加 query
,因为 Django 会在您看来为您完成:
def search_results(request):
zip_code = request.GET.get('zip_code')
print(zip_code)
...
我正在尝试创建一个简单的搜索表单(按邮政编码搜索),但很难将用户的输入传递给视图:
<form action="{% url 'search_results' query %}" method="post">
<div>
{% csrf_token %}
<input type = 'text' name = 'query' placeholder="Zip Code" />
<button type="submit" name="button">Find Jobs</button>
</div>
</form>
urls.py:
path('search_results/<str:query>', job_views.search_results, name = 'search_results'),
views.py:
def search_results(request, query):
query = request.GET['query']
return HttpResponse(query) # just trying to see if this view has access to 'query'
我不确定这里发生了什么。这个returns
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'search_results' with a
rguments '('',)' not found. 1 pattern(s) tried: ['search_results\/(?P<que
ry>[^/]+)$']
感谢您的帮助!
模板不是这样工作的。
模板用于生成响应,然后返回给请求者。在这种情况下,您的主视图会生成一个 HTML 文档,该文档将传递给浏览器。该文档包含 url
模板标记的结果,该标记甚至在用户看到之前就已确定。模板标签不是引用 DOM 对象状态的方法!
相反,您通常应该有一个稳定的 URL 视图,不随查询而变化。通常,您将从表单数据表示中提取查询文本 - 在这里,它是 request.POST
类似字典的对象或(通常更好)绑定到 POST
数据的 Django 表单,因为您的表单使用 method="post"
.
可以使用 Javascript 编辑 DOM 并在提交之前更改您的表单操作以包含查询文本,但这不是处理表单的常用模式。模板标签永远不会这样做 - 它们仅用于生成响应。
在您的表单中,在行:action="{% url 'search_results' query %}"
,您正试图将 query
传递给 url 标记,这样就可以了 if 查询有一个值,但在您的情况下查询未定义。
相反,您的表格应该如下所示:
<form action="{% url 'search_results' %}" method="GET">
<div>
<input type = "text" name = "zip_code" placeholder="Zip Code" />
<button type="submit" name="button">Find Jobs</button>
</div>
</form>
请注意,我从您的 url 标签中删除了 query
,并将方法更改为 GET
,详情请参阅 this question。
现在更改您的路径:
path('search_results', job_views.search_results, name = 'search_results')
您不需要在路径中添加 query
,因为 Django 会在您看来为您完成:
def search_results(request):
zip_code = request.GET.get('zip_code')
print(zip_code)
...