【问题标题】:Paginator not working properly while filtering the querysets?过滤查询集时分页器无法正常工作?
【发布时间】:2020-07-09 13:42:20
【问题描述】:

这里的过滤工作正常,并且分页器在第一页上工作正常。问题是如果有的话,在进入下一页时。它会在下一页显示剩余数据,但如果我进入下一页,则显示 0 数据。

Paginator 仅在过滤器视图中不起作用。所以我认为问题出在这个视图中,因为我有相同的搜索和列表查询集视图模板,并且在那里分页工作正常。

编辑:我使用具有相同上下文名称的相同模板进行搜索、过滤器和列表视图,但仅在过滤器中出现了分页问题。

搜索网址如下所示

 (at first)  search/?q= and in the next page search/?page=2 while going previous page search/?page=1 # this works fine

在进行过滤时,我期望相同,但它不起作用。在 filter/?page=2 中没有数据。

观看次数

def get(self, request):
    results = MyModel.objects.none()
    parameter = request.GET.get('param', '')
    today = datetime.datetime.today()
    current_month = today.month
    past_7_days = today - datetime.timedelta(days=7)
    if parameter == '0':
        return redirect('show_all_querysets')
    elif parameter == '1':
        results = MyModel.objects.filter(datetime__date=today.date()).order_by('-datetime')
    elif parameter == '2':
        results = MyModel.objects.filter(datetime__range=[past_7_days, today]).order_by('-datetime')
    elif parameter == '3':
        results = MyModel.objects.filter(datetime__month=current_month).order_by('-datetime')
    querysets = Paginator(results, 10).get_page(request.GET.get('page'))
    return render(request, 'show_all_querysets.html', {'querysets': querysets})

搜索视图

 def get(self, request):
        q = request.GET.get('q', '')
        results = MyModel.objects.filter(message__icontains=q)).order_by('-datetime')
        querysets = Paginator(results, 10).get_page(request.GET.get('page'))
        return render(request, 'show_all_querysets.html', {'querysets': querysets})

模板

 <div class="paginate-navigate ml-3">
                 {% if querysets.has_previous %}
                <a href="?{% if prev_url %}{{ prev_url }}{% endif %}page={{ querysets.previous_page_number}}">
                    <i title="previous" class="ic-chevron-left left"></i>
                </a>
                {% else %}
                <a disabled href="#">
                    <i class="ic-chevron-left left"></i>
                </a>
                {% endif %}

                {% if querysets.has_next %}
                <a href="?{% if prev_url %}{{ prev_url }}{% endif %}page={{ querysets.next_page_number}}">
                    <i title="next" class="ic-chevron-right right ml-2"></i>
                </a>
                {% else %}
                <a href="#">
                    <i class="ic-chevron-right right ml-2"></i>
                </a>
                {% endif %}

            </div>

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    如果您在查询参数中同时使用搜索过滤器和分页,那么您的网址将类似于 your_url/?params=some&amp;page=2

    为了实现这第一次通过你的paramscontext

    return render(request, 'show_all_querysets.html', {'querysets': querysets,'parameter':parameter})
    

    然后假设你有上一个和下一个按钮,所以像这样给出href:

    {% if querysets.has_previous %}
    <a class="btn btn-outline-dark" href="{% if parameter %}{{ request.get_full_path }}&page={{ querysets.previous_page_number }}{% else %}?page={{ querysets.previous_page_number }}{% endif %}">Previous</a>
    {% else %}
    <button type="button" disabled class="btn btn-outline-dark" title = "No querysets available">Previous</button>
    {% endif %}
    {% if querysets.has_next %}
    <a class="btn btn-outline-dark" href="{% if parameter %}{{ request.get_full_path }}&page={{ querysets.next_page_number }}{% else %}?page={{ querysets.next_page_number }}{% endif %}">Next</a>
    {% else %}
    <button disabled type="button" class="btn btn-outline-dark" title = "No querysets available">Next</button>
    {% endif %}
    

    【讨论】:

    • 编辑了我的问题。你能看看这个吗?
    • 但我的答案是一样的,如果你有搜索查询然后在模板中传递它,否则为假
    • 我有点困惑为什么我不必通过搜索查询?
    • 在搜索视图中 {'parameter':q} 在上下文中添加这个
    • 我的意思是分页在搜索视图中可以正常工作,而无需发送参数q,但为什么它不适用于过滤视图?两种情况不都一样吗?
    【解决方案2】:
    querysets = Paginator(results, 10).page(request.GET.get('page'))
    

    【讨论】:

    • 虽然您所写的内容可能会回答这个问题,但它在explanation 中似乎确实有些欠缺,并且可能会给其他用户造成非法混淆。您能否扩展您的答案,使其更清晰、更易于理解?这将提供更好的答案,并帮助未来的用户了解问题是如何解决的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2019-11-12
    • 2015-02-14
    • 2013-08-16
    相关资源
    最近更新 更多