【问题标题】:Reverse for *view* with arguments '('',)' not found未找到带有参数 '('',)' 的 *view* 的反向操作
【发布时间】:2020-05-11 04:47:11
【问题描述】:

我正在尝试创建一个简单的搜索表单(按邮政编码搜索),但正在努力将用户的输入传递给视图:

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

我不确定这里发生了什么。这会返回

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>[^/]+)$']

感谢您的帮助!

【问题讨论】:

    标签: django django-models django-forms django-urls


    【解决方案1】:

    在您的表单中,在以下行: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)
        ...
    

    【讨论】:

    • 您第二次回答了我的一个问题,谢谢。另外,关于 POST 与 GET 的好问题。
    【解决方案2】:

    模板不是这样工作的。

    模板用于生成响应,该响应会返回给请求者。在这种情况下,您的主视图会生成一个 HTML 文档,该文档将被传递给浏览器。该文档包含url 模板标签的结果,该标签在用户看到它之前就已确定。模板标签不是引用 DOM 对象状态的方法!

    相反,您通常应该有一个具有稳定 URL 的视图,而不是随查询而变化。通常,您将从表单数据表示中提取查询文本 - 在这里,它将是 request.POST 类字典对象或(通常更好)绑定到 POST 数据的 Django 表单,因为您的表单使用method="post"

    可以使用 Javascript 编辑 DOM 并在提交之前更改表单操作以包含查询文本,但这不是处理表单的常用模式。并且模板标签永远不会这样做 - 它们仅用于生成响应。

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 2012-07-08
      • 2023-04-03
      • 2021-03-21
      • 2015-02-18
      • 2021-11-09
      • 2019-09-14
      • 2021-03-01
      • 1970-01-01
      相关资源
      最近更新 更多