【问题标题】:Django Filter - Paginate resultsDjango 过滤器 - 对结果进行分页
【发布时间】:2019-07-11 00:59:02
【问题描述】:

我正在使用 django-filter 来输出我的模型的过滤结果。那里没有问题。 下一步是添加分页器.. 虽然现在挣扎了好几天。

views.py:

def funds_overview(request):
 f = FundFilter(request.GET, queryset=Fund.objects.all()).qs
 paginator = Paginator(f, 5)
 page = request.GET.get('page')
 funds = paginator.get_page(page)
 return render(request, 'funds/funds.html', {'filter': funds})

funds.html:

<form method="get">
<div class="well">
 <h4 style="margin-top: 0">Search Criteria</h4>

  <div class="row">
   <div class="form-group col-sm-4 col-md-3">
    {{ filter.form.fund_name.label_tag }}
    {% render_field filter.form.fund_name class="form-control" %}
   </div>
  </div>

<button type="submit" class="btn btn-primary">
  <span class="glyphicon glyphicon-search"></span> Search
</button>

{% for fund in filter.qs %}
<p>{{fund.name}} </p>

{% empty %}

No funds match your search criteria

{% endfor %}

浏览器中的结果 “没有资金符合您的搜索条件”行 ..

谁能帮忙?我认为两次调用 GET 请求有问题?

谢谢!

【问题讨论】:

  • 我已经发布了一个答案,显示您的模板中的页面使用存在问题,它有帮助吗?

标签: django pagination django-filter django-pagination


【解决方案1】:

您正在传递一个新的上下文,其中 filter 现在是一个页面,因此当使用{% for fund in filter.qs %} 时,您访问的字段在页面对象中不存在,因此将出现一个空循环.

尝试将filter.qs 更改为过滤器。

它会解决分页问题,​​但是随着上下文传递给渲染函数,还会出现另一个问题。如下所示,您应该添加另一个上下文变量以保持您的页面显示过滤后的表单。

views.py

def funds_overview(request):
 funds = FundFilter(request.GET, queryset=Fund.objects.all()).qs
 paginator = Paginator(f, 5)
 page = request.GET.get('page')
 fund_page = paginator.get_page(page)
 return render(request, 'funds/funds.html', {'filter': funds, 'page': fund_page})

funds.html

<form method="get">
<div class="well">
 <h4 style="margin-top: 0">Search Criteria</h4>

  <div class="row">
   <div class="form-group col-sm-4 col-md-3">
    {{ filter.form.fund_name.label_tag }}
    {% render_field filter.form.fund_name class="form-control" %}
   </div>
  </div>

<button type="submit" class="btn btn-primary">
  <span class="glyphicon glyphicon-search"></span> Search
</button>

{% for fund in page %}
<p>{{fund.name}} </p>

{% empty %}

No funds match your search criteria

{% endfor %}
Page {{ page.number }} of {{ page.paginator.num_pages }}

【讨论】:

  • 嗨贝尔纳多。它有部分帮助:现在我看到了数据库的前 5 行。虽然没有“第 1 页,共 2 页”或类似内容,并且(和以前一样)搜索字段/表单没有出现
  • @TMD 我已经更新了答案以显示您的案例的可能解决方案。
  • 谢谢贝尔纳多。它现在确实显示“第 x 页,共 y”,但我无法翻阅它..?
  • @TMD 我相信这完全是另一个问题,我认为您最好先自己尝试一下;D 无论如何,我想this link 应该会有所帮助。如果我的回答帮助您实现了问题目标,请不要忘记点赞并标记为已解决。
  • @BernardoDuarte 感谢帮助!我的问题是我将 for 循环与我的过滤器有效负载一起使用,而不是我的分页有效负载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2011-03-31
  • 2013-05-04
  • 2018-12-25
  • 2017-11-23
相关资源
最近更新 更多