在过滤结果后,Paginator页数不会以HTML格式更新 - Django

时间:2017-10-24 08:41:40

标签: html django pagination

使用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>

如何在不添加新的上下文键,值对的情况下以正确方式执行此操作的任何建议?

1 个答案:

答案 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