反向 *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)
    ...