Не удается устранить ошибку NoReverseMatch в Django

Я новичок в Django и пытаюсь создать быстрый поисковик, но у меня есть эта ошибка, и я не могу ее исправить после прочтения документации Django. Кто-нибудь может мне помочь? Спасибо.

Это ошибка:

Reverse for 'search' with no arguments not found. 1 pattern(s) tried: ['(?P<name>[^/]+)$']

Мои коды следующие:

layout.html

        <form method="POST" action="{% url 'encyclopedia:search' %}">
            {% csrf_token %}
            <input class="search" type="text" name="q" placeholder="Search Encyclopedia">
            <input type="submit" value="Go">
        </form>

urls.py

from django.urls import path

from . import views

app_name = "encyclopedia"

urlpatterns = [
    path("", views.index, name="index"),
    path("<str:name>", views.entry, name="entry"),
    path("<str:name>", views.search, name="search")
]

views.py

def search(request, searched_name):
    """
    Deal with search engine on the left widget
    """
    result = util.get_entry(searched_name)

    if result:
        return HttpResponseRedirect(reverse('encyclopedia:entry', args=(result)))
    
    return render(request, "encyclopedia/error.html", {
        "error_name": "Requested page not found"
    })    
Источник
Codelisting
за 1 против
Лучший ответ

Ваши второй и третий URL-адреса совпадают, поэтому пробуется только один шаблон, и, учитывая, что шаблон с именем search не является первым, django не может найти обратное совпадение. URL-адреса не очень хорошо продуманы, так как они оба будут соответствовать любой строке после корня домена, и это определенно станет кошмаром по мере роста вашего проекта. Рассмотрите возможность использования их, как показано ниже:

urlpatterns = [
    ...
    path("entry/<str:name>", views.entry, name="entry"),
    path("search/<str:name>", views.search, name="search")
]
за 0 против

Согласно вашемуurls.py , тебе следуетname в самом URL.

Я предложу вам удалитьname из urls.py и получайте просмотры через данные формы. См. Пример ниже

urls.py ->path("search/", views.search, name="search")

def search(request):
    """
    Deal with search engine on the left widget
    """
    result = util.get_entry(request.POST.get('q', None))

    if result:
        return HttpResponseRedirect(reverse('encyclopedia:entry', args=(result)))
    
    return render(request, "encyclopedia/error.html", {
        "error_name": "Requested page not found"
    })    
  • 0
    оно работает. Большое спасибо. Я просто запутался, как передать параметр q в views.py
Codelisting
Популярные категории
На заметку программисту