Django пагинация с поиском не работает
MultiValueDictKeyError at /search/
'search'
Метод запроса: GET
URL запроса: http://127.0.0.1:8000/search/?page=2.
Версия Django: 4.1.5
Тип исключения: MultiValueDictKeyError
Значение исключения:
'search'
Местоположение исключения: C:\Python311\Lib\site-packages\django\utils\datastructures.py, строка 86, in getitem.
Поднято во время: blogs.views.search
Python Executable: C:\Python311\python.exe
Версия Python: 3.11.0
views.py
def search(request):
search = request.POST["search"]
blog_search = Blog.objects.filter(Q(title__icontains=search) | Q(description__icontains=search))
paginator = Paginator(blog_search, 5)
page_number = request.GET.get('page')
blogs = paginator.get_page(page_number)
return render(request,"frontend/searchblogs.html",{"blogs":blogs})
Использование:
views.py
def search(request):
search = request.GET["search"]
...
Вы передаете GET-запрос через сервер (часть URL ?page), поэтому вам придется получить данные с помощью request.GET['name']. Вам также следует изменить метод формы на GET. Для поиска нет веских причин использовать POST.
<div class="container">
<nav class="navbar navbar-light bg-light justify-content-end">
<form class="form-inline" method="GET" action="{%url 'search' %}">
{% csrf_token %}
<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" name="search" id="search" >
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</nav>
...
</div>
Вот документация: https://docs.djangoproject.com/en/4.1/ref/request-response/#querydict-objects
Методы формирования: https://www.w3schools.com/tags/ref_httpmethods.asp
Если вы должны использовать метод POST, обратитесь к этому вопросу: Пагинация результатов POST запроса Django forms