路径功能无法识别问号

时间:2018-07-18 10:34:13

标签: python regex django url

我正在使用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>)/$'

3 个答案:

答案 0 :(得分:2)

Django使用请求路径来确定要应用的网址格式。路径是URL中http://domain:port/部分之后和?arg1=value1&arg2=value2部分之前的所有内容。在您的情况下,两种情况下的路径均为contract/

要处理?之后的参数,您应该使用request.args或类似的东西在端点中编写特定的代码。但是,就您而言,我认为您应该停止使用默认搜索表单,并编写一些JavaScript以使其按需导航至contract/id

答案 1 :(得分:1)

一种可能是这样:

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。

答案 2 :(得分:0)

要处理查询参数(问号?之后的部分),请使用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})