【问题标题】:Paginator Number of Pages does not update in HTML after filtering results - Django过滤结果后,分页器页数在 HTML 中不更新 - Django
【发布时间】:2018-04-04 23:26:56
【问题描述】:

使用 django_filter 过滤后,HTML 中的分页器页数不会更新。

html 文件

<span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>

page_obj.paginator.num_pages 是表中所有结果的初始编号(没有任何过滤器)(例如:我得到 12 个结果并显示 3 个结果/页 => 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>

关于如何在不添加新的上下文键、值对的情况下正确执行此操作的任何建议?

【问题讨论】:

  • “添加过滤器后”是什么意思?
  • 添加了带有完整 HTML 和过滤器类的编辑更新。过滤器返回自定义查询集的结果(例如,我想显示“小说”类别中所有书籍的结果)。希望我能够解释一下,因为我是 Py 和 Django 的新手

标签: html django pagination


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2019-06-30
    • 2018-05-11
    • 2013-04-15
    相关资源
    最近更新 更多