Django Ошибка загрузки страницы ?page=undefined
изучаю пагинацию и не понимаю, почему переменная page не определена. Я могу навести курсор на каждый объект страницы и подсказка показывает правильную страницу=page#, каждая кнопка также пронумерована правильно.
Это функция с точки зрения приложения:
def projects(request):
projects, search_query = searchProjects(request)
results = 4
page_number = request.GET.get('page')
if page_number == None:
page_number = 1
paginator = Paginator(projects, results)
try:
projects = paginator.page(page_number)
except PageNotAnInteger:
page_number = 1
projects = paginator.page(page_number)
context = {
'projects': projects,
'search_query': search_query,
'paginator': paginator
}
return render(request, 'projects/projects.html', context)
html-код для пагинации выглядит следующим образом:
<div class="pagination">
<ul class="container">
{% for page in paginator.page_range %}
{% if page == paginator.number %}
<li><a href="?page={{page}}" class="btn page-link btn--sub" >{{page}}</a></li>
{% else %}
<li><a href="?page={{page}}" class="btn page-link">{{page}}</a></li>
{% endif %}
{% endfor %}
</ul>
</div>
при нажатии на страницу, страница не обновляется до нужной страницы и не показывает текущую страницу выделенной, отображается начальное содержимое (1-я страница). Когда я печатаю значения атрибутов пагинатора, я вижу, что генерируются правильные страницы и объекты ссылаются правильно. Просто не понимаю, почему ссылки на якорь {{page}} не возвращаются в представление по событию GET. Вот что, как я подозреваю, вызывает проблему неопределенной страницы.
Спасибо за просмотр!
Django Newbie.
get_page
возвращает объект Page
, а не Paginator
, поэтому при итерации нужно делать paginator.paginator.page_range
.
Я бы рекомендовал рефакторинг вашего представления, чтобы избежать путаницы
def projects(request):
projects, search_query = searchProjects(request)
results = 4
page_number = request.GET.get('page',1) # defaults to 1 if null
paginator = Paginator(projects, results)
page_object = paginator.get_page(page_num) # use get page to handle edge cases
context = {
'projects': projects,
'search_query': search_query,
'page_object': page_object # change paginator var name to avoid confusion
}
return render(request, 'projects/projects.html', context)
Посмотрите, как вам не нужно обрабатывать исключения, если вы используете get_handle
И ваш цикл теперь будет
{% for page in page_object.paginator.page_range %}