更改 GET url 的显示方式

Change how GET url is displayed

总结:如果我搜索 'apple',url 将是 http://127.0.0.1:8000/search_results?csrfmiddlewaretoken=rlUwb5Ju3Xr585FarH5eAGQJtpog83hqW4wRysbsMWM6eiO3prcKRONY28N118gR&query=apple&button=,我只想知道是否有办法将其更改为更清晰的内容,例如 [=18] =]? 这是我的代码:

urls.py

path('search_results', views.search_results, name = 'search_results'),

html:

 <form action="{% url 'search_results' %}" method="GET">
     {% csrf_token %}
     <input  name = 'query' type = 'text'/>
     <button type="submit" name="button">Search</button>

 </form>

和views.py:

def search_results(request):
    query =request.GET.get('query')
    return HttpResponse(query)

我曾尝试在各自的文件中更改这 3 行:

`path('search_results/<str:query>')`, # thought this would achieve /search_results/apple url

<form action="{% url 'search_results' 'query' %}" method="GET"> 

def search_results(request, query):

但这没有用。有谁知道我怎样才能做到这一点?

GET 参数在 query string [wiki] 中编码。查询字符串是路径的 而不是 的一部分。因此无法以这种方式进行编码。但是您确实可以制作一个 "redirect view" 将其移动到路径。

您可以将重定向更改为:

# app/views.py

from django.shortcuts import redirect

def search_redir(request):
    query =request.GET.get('query')
    return <b>redirect('search_results', query=query)</b>

def search_results(request, query):
    # …
    pass

然后在您的 urls.py 中定义两个视图:一个将 "catch" 带有查询字符串的初始 GET 请求,另一个将查询移动到路径:

# app/urls.py

from django.urls import path

urlpatterns = [
    path('search_results/', views.search_redir, name='search_redir'),
    path('search_results/<str:query>/', views.search_results, name='search_results'),
]

但是在您的表单中,您仍然使用重定向视图。请注意,由于您执行的是 GET 请求,因此您不需要使用 {% csrf_token %}:

<form action="{% url <b>'search_redir'</b> %}" method="GET">
    <input  name="query" type ="text"/>
    <button type="submit" name="button">Search</button>
</form>