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