Проблема с пагинацией результатов из стороннего API в Django
Я делаю проект портфолио, в котором я использую API Google Books API для поиска книг и класс Django Paginator для постраничной выдачи результатов. Я смог получить результаты поиска, используя CBV FormView и GET запрос, но не могу понять, как заставить работать пагинацию для ответа API.
Решением, которое я могу придумать, является добавление &page=1 к url первого поиска, а затем получение этого параметра при каждом GET-запросе и использование его для пагинации. Проблема в том, что я не могу понять, как добавить этот параметр в первый поиск, и я не знаю, как увеличить значение этого параметра при нажатии на кнопки пагинации
Вот что у меня есть сейчас:
Форма:
class SearchForm(forms.Form):
search = forms.CharField(label='Search:', max_length=150)
Вид:
class HomeView(FormView):
template_name = "home.html"
form_class = SearchForm
pageIndex = 0
def get(self, request, *args, **kwargs):
# get submitted results in view and display them on results page. This will be swapped out for an AJAX call eventually
if "search" in request.GET:
# getting search from URL params
search = request.GET["search"]
kwargs["search"] = search
context = super().get_context_data(**kwargs)
# Rest API request
response = requests.get(
f'https://www.googleapis.com/books/v1/volumes?q={search}&startIndex={self.pageIndex}&key={env("BOOKS_API_KEY")}'
)
response = response.json()
items = response.get("items")
# pagination...needs work
paginator = Paginator(items, 2)
page_obj = paginator.get_page(1)
context["results"] = page_obj
return self.render_to_response(context)
else:
return self.render_to_response(self.get_context_data())
Шаблон:
{% extends "base.html" %}
{% block content %}
<form action="/">
{{ form }}
<input type="submit" value="Submit">
</form>
<h1>Books</h1>
<ul>
{% for result in results %}
<li>{{ result.volumeInfo.title }} : {{result.volumeInfo.authors.0}}</li>
{% empty %}
<li>Search to see results</li>
{% endfor %}
</ul>
{% if results %}
<div class="pagination">
<span class="step-links">
{% if results.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ results.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ results.number }} of {{ results.paginator.num_pages }}
</span>
{% if results.has_next %}
<a href="?page={{ results.next_page_number }}">next</a>
<a href="?page={{ results.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
{% endif %}
{% endblock content %}
Я также рассматривал Django REST Framework для этого, но ответ API Google Books не содержит никакой информации о следующей странице, предыдущей странице и т.д. Я уже делал подобную пагинацию в React, и это не сложно, мне просто трудно приспособить мою ментальную модель того, как это сделать, к Django. Если кто-нибудь может дать совет, как заставить это работать, я буду очень благодарен.