django filter之后获取当前分页的数据
时间: 2024-10-12 13:12:42 浏览: 31
Django Rest Framework分页过滤排序代码示例
在Django中,当你对一个QuerySet进行过滤后,获取当前分页的数据可以通过使用Django的Paginator类来实现。以下是具体步骤和示例代码:
1. **导入必要的模块**:
你需要导入Paginator类,这个类位于`django.core.paginator`模块中。
2. **创建过滤器后的QuerySet**:
首先,根据需要对数据进行过滤。例如,假设你有一个模型`MyModel`,你想过滤出所有字段`name`包含某个关键字的数据:
```python
from django.core.paginator import Paginator
from myapp.models import MyModel
from django.db.models import Q
# 假设你要过滤的条件是name字段包含'keyword'
queryset = MyModel.objects.filter(Q(name__icontains='keyword'))
```
3. **创建Paginator对象**:
然后,你可以创建一个Paginator对象,并指定每页显示的数据条数。例如,每页显示10条数据:
```python
paginator = Paginator(queryset, 10) # 每页显示10条数据
```
4. **获取当前页的数据**:
通过GET请求中的`page`参数来获取当前页的数据。例如,如果用户请求的是第3页的数据,可以这样获取:
```python
page_number = request.GET.get('page')
# 将page_number转换为整数,如果用户没有提供page参数,则默认为第1页
page_obj = paginator.get_page(page_number)
```
5. **传递数据到模板**:
最后,将获取到的分页数据传递给模板,以便在前端展示:
```python
context = {
'page_obj': page_obj,
}
return render(request, 'my_template.html', context)
```
6. **在模板中展示数据**:
在你的模板文件中,你可以使用`page_obj`来访问分页后的数据和分页信息。例如:
```html
{% for object in page_obj %}
{{ object }}
{% endfor %}
<!-- 分页导航 -->
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
```
阅读全文