Реверс для * view * с аргументами '(' ',)' не найден - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь создать простую форму поиска (поиск по почтовому индексу), но пытаюсь передать введенные пользователем данные для просмотра:

 <form action="{% url 'search_results' query %}" method="post">
   <div>
     {% csrf_token %}
     <input type = 'text' name = 'query' placeholder="Zip Code" />
     <button type="submit" name="button">Find Jobs</button>
   </div>
 </form>

urls.py:

path('search_results/<str:query>', job_views.search_results, name = 'search_results'),

views.py:

def search_results(request, query):
    query = request.GET['query']
    return HttpResponse(query) # just trying to see if this view has access to 'query'

Я не уверен, что здесь происходит. Это возвращает

raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'search_results' with a
rguments '('',)' not found. 1 pattern(s) tried: ['search_results\\/(?P<que
ry>[^/]+)$']

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 25 января 2020

В вашей форме в строке: action="{% url 'search_results' query %}" вы пытаетесь передать query тегу url, что было бы хорошо , если бы запрос имел значение, но в вашем случае запрос isn не определено.

Вместо этого ваша форма должна выглядеть следующим образом:

<form action="{% url 'search_results' %}" method="GET">
   <div>
     <input type = "text" name = "zip_code" placeholder="Zip Code" />
     <button type="submit" name="button">Find Jobs</button>
   </div>
</form>

Обратите внимание, что я удалил query из вашего URL-тега и изменил метод на GET см. этот вопрос для подробностей.

Теперь измените ваш путь:

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

Вам не нужно добавлять query к пути, потому что Django сделает это за вас, на ваш взгляд:

def search_results(request):
    zip_code = request.GET.get('zip_code')
    print(zip_code)
    ...
0 голосов
/ 25 января 2020

Это не так, как работают шаблоны.

Шаблоны используются для получения ответа, который возвращается запрашивающей стороне. В этом случае ваш основной вид создает документ HTML, который будет передан в браузер. Этот документ содержит результаты тега шаблона url, который определяется еще до того, как пользователь его увидит. Теги шаблонов не являются способом ссылки на состояние объектов DOM!

Вместо этого у вас обычно должно быть представление со стабильным URL, не зависящим от запроса. Обычно вы извлекаете текст запроса из представления данных формы - здесь это будет словарный объект request.POST или (обычно лучше) форма Django, которую вы привязываете к данным POST, потому что Ваша форма использует method="post".

Можно было бы использовать Javascript для редактирования DOM и изменения действия формы перед отправкой, чтобы включить текст запроса, но это не обычный шаблон для работы с формы. И теги шаблонов никогда этого не сделают - они используются только для генерации ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...