下面我将详细讲解“Django框架实现的分页demo示例”的完整攻略。
- 示例一
首先,我们需要在Django的项目中安装分页组件django-paginate。在终端中使用以下命令安装:
pip install django-paginate
接下来,在views.py文件中编写视图函数。假设我们需要对一个产品列表进行分页,代码如下:
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from myapp.models import Product
def products(request):
product_list = Product.objects.all()
paginator = Paginator(product_list, 25) # 每页显示25条记录
page = request.GET.get('page')
try:
products = paginator.page(page)
except PageNotAnInteger:
products = paginator.page(1)
except EmptyPage:
products = paginator.page(paginator.num_pages)
return render(request, 'products.html', {'products': products})
以上代码首先从数据库中获取所有产品记录,然后使用Paginator类将它们分成每页25条记录。接下来,根据请求中的page参数,获取对应的页数并返回该页面的产品记录。如果page参数为空或者不是一个整数,将第一页作为默认值。
最后,在模板文件products.html中进行展现,示例代码如下:
{% for product in products %}
<p>{{ product.name }}</p>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if products.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ products.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ products.number }} of {{ products.paginator.num_pages }}.
</span>
{% if products.has_next %}
<a href="?page={{ products.next_page_number }}">next</a>
<a href="?page={{ products.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
以上HTML代码通过使用Django自带的分页模板标签来展现产品列表和分页链接。在渲染该页面时,服务器会根据URL中的page参数生成对应的页面内容和分页链接。
- 示例二
第二个示例比第一个稍微复杂一些,它演示了如何使用Ajax来实现无刷新的分页。首先,我们需要使用Ajax向服务器端请求数据,然后使用JavaScript将响应数据展现在页面上。
以下是视图函数的代码:
from django.shortcuts import render, HttpResponse
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from myapp.models import Product
import json
def products_json(request):
product_list = Product.objects.all()
paginator = Paginator(product_list, 25)
page = request.GET.get('page')
try:
products = paginator.page(page)
except PageNotAnInteger:
products = paginator.page(1)
except EmptyPage:
products = paginator.page(paginator.num_pages)
response_data = {
'products': [
{'name': p.name}
for p in products
],
'current_page': products.number,
'num_pages': paginator.num_pages
}
return HttpResponse(json.dumps(response_data), content_type='application/json')
以上代码和第一个示例中的视图函数类似,不同之处在于该视图函数返回json格式的数据,而不是HTML页面。
以下是模板文件的HTML代码:
<div class="products-list"></div>
<div class="pagination">
<span class="step-links">
{% if products.has_previous %}
<a href="#" class="prev-link">previous</a>
{% endif %}
<span class="current-page">
Page {{ products.number }} of {{ products.paginator.num_pages }}.
</span>
{% if products.has_next %}
<a href="#" class="next-link">next</a>
{% endif %}
</span>
</div>
<script>
$(document).ready(function () {
var currentPage = 1;
function getProducts(page) {
$.ajax({
url: '/products-json/?page=' + page,
dataType: 'json',
success: function (data) {
$('.products-list').empty();
$.each(data.products, function (index, product) {
$('.products-list').append('<p>' + product.name + '</p>');
});
$('.current-page').text('Page ' + data.current_page + ' of ' + data.num_pages);
currentPage = data.current_page;
}
});
}
$('.pagination .prev-link').on('click', function (e) {
e.preventDefault();
getProducts(currentPage - 1);
});
$('.pagination .next-link').on('click', function (e) {
e.preventDefault();
getProducts(currentPage + 1);
});
getProducts(1);
});
</script>
以上代码定义了一个初始页码为1的变量,然后使用jQuery监听分页链接的点击事件,并在点击链接时向服务器端发送Ajax请求。在请求成功后,jQuery会将返回的json数据解析成HTML,然后动态地展现在页面上。
好了,以上就是“Django框架实现的分页demo示例”的完整攻略。希望能对您有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django框架实现的分页demo示例 - Python技术站