使用django_filter过滤后,Paginator页数不会以HTML格式更新。
html文件
<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
page_obj.paginator.num_pages
是表格中所有结果的初始数字(没有任何过滤器)(例如:我得到12个结果,显示3个结果/页面=&gt; 4个页面)
视图
class SearchBookView(ListView):
template_name = "booksearch.html"
paginate_by = 3
model = Book
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
book_qs = Book.objects.all()
book_filter = BookFilter(self.request.GET, queryset=book_qs)
paginator = Paginator(book_filter.qs, self.paginate_by)
print(paginator.num_pages) ### Prints the correct num pages everytime even after filtering
page = self.request.GET.get('page')
try:
book_list = paginator.page(page)
except PageNotAnInteger:
book_list = paginator.page(1)
except EmptyPage:
book_list = paginator.page(paginator.num_pages)
context['book_list'] = book_list
context['book_filter'] = book_filter
return context
添加过滤器后(让我们说过滤后显示5个结果)page_obj.paginator.num_pages
在我的HTML中应为2,对吧?虽然我在print(paginator.num_pages)
中的视图中显示了2,但在HTML中它保留了原始的4页。如何将其传递给HTML文件?
修改
过滤器
class BookFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='icontains')
author = django_filters.CharFilter(lookup_expr='icontains')
category = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Book
ields = ['name', 'author', 'category',]
完整HTML
<h1 class="h1"> Search Books </h1>
<form method="get">
{{ book_filter.form.as_p }}
<button type="submit">Search</button>
</form>
<div class="container">
<table>
<thead>
<tr>
<th>Name</th>
<th>Author</th>
<th>Category</th>
</tr>
</thead>
<tbody>
{% for book in book_list %}
<tr>
<td>{{ book.name }}</td>
<td>{{ book.author }}</td>
<td>{{ book.category }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if is_paginated %}
<ul class="pagination">
{% if page_obj.has_previous %}
<li>
<span><a href="?page={{ page_obj.previous_page_number }}">Previous</a></span>
</li>
{% endif %}
<li class="">
<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
</li>
{% if page_obj.has_next %}
<li>
<span><a href="?page={{ page_obj.next_page_number }}">Next</a></span>
</li>
{% endif %}
</ul>
{% else %}
<p>No books available</p>
{% endif %}
</div>
解决方法
我做了一个解决方法,但它有点难看:
在我的视图中我添加了context['num_pages'] = paginator.num_pages
并将其传递给 HTML :
<span>Page {{ page_obj.number }} of {{ num_pages }}.</span>
如何在不添加新的上下文键,值对的情况下以正确方式执行此操作的任何建议?
答案 0 :(得分:1)
您应该使用get_queryset
方法设置查询集。
def get_queryset(self):
book_qs = Book.objects.all()
self.book_filter = BookFilter(self.request.GET, queryset=book_qs)
return book_filter.qs
Django将负责对查询集进行分页,您需要在get_context_data
中执行的操作是将book_filter
添加到上下文中。
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['book_filter'] = self.book_filter
return context