Django Paginator在第一页之后不工作

0 投票
2 回答
1117 浏览
提问于 2025-04-16 06:15

正如标题所说,我的分页器在我点击去第二页时什么都不显示。
首先,让我简单介绍一下我的页面:
这个页面的功能是接收用户输入的请求,指定他们想查看的“通话记录”的时间段,还有其他一些筛选条件(这很重要)。所以基本上,用户会提供一个开始日期和结束日期,我用这些日期来过滤我的数据。
链接到“第二页”的形式是:“localhost:8000/?page=2”,这个链接会重定向到我现有的页面,但没有任何数据。现在很明显,下一页的链接应该包含其他参数,比如start_date=xxxx-xx-xx,不然就无法正常工作。

这是我view.py的一部分,我删掉了很多行以简化内容,代码运行得很好:

if request.GET:   
    filter_form = ReportFilterForm(request.GET)
    if filter_form.is_valid():
        start = filter_form.cleaned_data["start_date"]
        end = filter_form.cleaned_data["end_date"]  

        #a bunch of omitted lines that use the form to filter
        paginator = Paginator(queryset, 100)

        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1
        try:
            call_logs = paginator.page(page)
        except (EmptyPage, InvalidPage):
            call_logs = paginator.page(paginator.num_pages)
else:
    filter_form = ReportFilterForm()
return render_to_response('xxxx.html', 
                          {'queryset': queryset,
                           'filter_form': filter_form,
                           'call_logs': call_logs, 
                           })

这是我的模板xxxx.html,只有分页器的部分,比较标准,来自文档:

                {% if call_logs.paginator.num_pages %}
                <div class="pagination">
                    <span class="step-links">
                        {% if call_logs.has_previous %}
                            <a href="**{{ SOME_MAGIC_TEMPLATE_VARIABLE_THAT_GETS_CURRENT_ABSOLUTE_URL}}**&?page={{ call_logs.previous_page_number }}"><<</a>
                        {% endif %}
                        <span class="current">
                            Page {{ call_logs.number }} of {{ call_logs.paginator.num_pages }}
                        </span>
                                {% if call_logs.has_next %}
                                      <a href=" **{{ SOME_MAGIC_TEMPLATE_VARIABLE_THAT_GETS_CURRENT_ABSOLUTE_URL}}**&page={{ call_logs.next_page_number }}">>></a>
                                {% endif %}
                    </span>
                </div>
                {% endif %}

我的问题是,如何在django模板中获取当前窗口的URL,而不是用javascript?谢谢。

2 个回答

1

我的问题是,如何在Django模板中获取当前窗口的URL,而不是使用JavaScript?谢谢。

这可能不是最正确的方法,但你可以看看这个帖子

不过我建议你不要把过滤和分页混在一起。

你可以在做过滤时使用AJAX,创建一个专门处理过滤的新函数,或者你也可以用同一个函数并测试一下if request.is_ajax():,这样当用户进行过滤时,你就能在URL中得到过滤的数据(开始日期、结束日期)。

然后,当用户想要翻到下一页时,你已经在URL中有了过滤的参数,可以用来创建一个查询集,然后传给分页器。

如果要处理JavaScript不活跃的情况,你可以用一个简单的POST表单来替代AJAX,只要记得不要把过滤和分页混在一起就行了 :)

希望这能帮到你 :)

1

如果我理解得没错,你可以从请求对象中添加完整的路径到上下文里:

return render_to_response('xxxx.html', 
                          {'queryset': queryset,
                           'filter_form': filter_form,
                           'call_logs': call_logs,,
                           'magic_url': request.get_full_path(),
                           })

撰写回答