【问题标题】:Question mark not recognized with path function路径功能无法识别问号
【发布时间】:2018-07-18 10:34:12
【问题描述】:

我正在开发一个 django 网络应用程序。我正在尝试实现一个可以与网址“交流”的搜索字段。

我希望 http://127.0.0.1:8000/contract/ 在我在搜索字段中输入 ID 时将我重定向到 http://127.0.0.1:8000/contract/id

问题是,当使用搜索字段时,它会将我重定向到http://127.0.0.1:8000/contract/?search=id,这不是问题。但是当我尝试定义 urlpattern 时,它不会“识别”url 中的问号。结果是我无法访问正确的模板。

urlpatterns = [
    path('?search=<id_contract>/', app_views.view_contract),
    path('', app_views.contract, name='my_contract'),
]

我看到了两种可能的解决方案:要么我会尝试找到一种方法来删除那个问号,但我还没有真正找到在哪里做,所以非常感谢你的帮助!

第二个选项是使用正则表达式,但到目前为止我尝试过的没有奏效:

re_path(r'.+\?.*'+'search'+'(?P<id_contract>)/$'

【问题讨论】:

    标签: python regex django url


    【解决方案1】:

    Django 使用请求路径来确定要应用哪个 url 模式。路径是 URL 的 http://domain:port/ 部分之后和 ?arg1=value1&amp;arg2=value2 部分之前的所有内容。在这两种情况下,您的路径都是contract/

    要处理? 之后的参数,您应该在端点中编写特定代码,使用request.args 或其他东西。但是,在您的情况下,我认为您应该停止使用默认搜索表单并编写一些 JavaScript 以使其导航到您想要的 contract/id

    【讨论】:

      【解决方案2】:

      一种可能性是:

      urlpatterns = [
          url(r'^contract/(?P<id_contract>\d+)/$', app_views.view_contract),
      ]
      

      在这种情况下,您的视图必须如下所示:

      def view_contract(request, id_contract):
          # your code
      

      端点看起来像http://localhost:8000/contract/1234/,其中1234是合约的ID。

      【讨论】:

      • 我会推荐这个作为真正的答案。它做你想做的事情,它更像是一个“官方”网址,而不是使用 GET 查询。
      【解决方案3】:

      要处理查询参数(问号? 后面的部分),请使用request.GET,其行为类似于python 字典。

      在您的情况下,?search=id 将导致 request.GET 包含 {'search': 'id'}。您可以使用以下代码行中的内容:

      urlpatterns = [
          path('', app_views.contract, name='my_contract'),
      ]
      
      def view_contract(request):
          search_value = request.GET.get('search', '')
      
          # do something if it meets certain conditions
          if search_value == 'id':
              # here you could do your redirect if its still needed
              return redirect('...')
      
          return render(request, 'template_name.html', {'search': search_value})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-25
        • 2016-09-11
        • 2015-04-19
        • 2021-01-06
        • 1970-01-01
        • 2019-07-20
        • 2014-03-14
        相关资源
        最近更新 更多