Изменить способ отображения URL GET - PullRequest
1 голос
/ 26 января 2020

Резюме: если я найду 'apple', URL будет http://127.0.0.1:8000/search_results?csrfmiddlewaretoken=rlUwb5Ju3Xr585FarH5eAGQJtpog83hqW4wRysbsMWM6eiO3prcKRONY28N118gR&query=apple&button=, и я просто хочу знать, есть ли способ изменить это на что-то более чистое, например 127.0.0.1:8000/search_results/apple? Вот мой код:

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):

, но это не сработало. Кто-нибудь знает, как мне этого добиться?

1 Ответ

2 голосов
/ 26 января 2020

Параметры GET кодируются в строке запроса [wiki] . Строка запроса не часть пути. Таким образом, нет способа закодировать это таким образом. Но вы действительно можете создать «представление перенаправления», которое перемещает его по пути.

Вы можете изменить перенаправление на:

# 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):
    # &hellip;
    pass

В вашем urls.py вы затем определяете два представления : тот, который будет «перехватывать» начальный запрос 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>
...