Я новичок в 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"
})
Ваши второй и третий URL-адреса совпадают, поэтому пробуется только один шаблон, и, учитывая, что шаблон с именем search не является первым, django не может найти обратное совпадение. URL-адреса не очень хорошо продуманы, так как они оба будут соответствовать любой строке после корня домена, и это определенно станет кошмаром по мере роста вашего проекта. Рассмотрите возможность использования их, как показано ниже:
urlpatterns = [
...
path("entry/<str:name>", views.entry, name="entry"),
path("search/<str:name>", views.search, name="search")
]
Согласно вашему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"
})