当我们要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。
Django为我们提供了一个Paginator分页工具,但这个工具功能差了点,不好添加CSS样式,所以前端的展示效果比较丑。
需要导包:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def index(request):
all_ = models.类名.objects.all() # 获取类对象
id = request.GET.get(‘网页参数’,1) # 请求网页参数,如果没获取到默认为1
p = Paginator(all_, 2) # 使用分页器:传入两个参数(对象结果集 两条为一页)
p1 = p.page(int(id)) # 返回请求到的参数页,展示此页数据对象(网页参数必须int类型)
return render(request,'index.html',locals())
Paginator() :创建分页对象
page() :返回请求到的参数页,展示此页数据对象(网页参数必须int类型)
简单来说,使用分页分四步:
1.获取要展示的对象列表QuerySet。
2.将列表和每页个数传递给Paginator,返回一个分页对象。
3.调用该对象的各种方法,获取各种分页信息。
4.在HTML模板中,使用下面的分页信息构建分页栏。
模板页使用:
p1.has_previous # 如果有上一页
p1.previous_page_number # 上一页的页码
p.page_range # 列表形式返回当前所有的页数
p1.has_next # 如果有下一页
p1.next_page_number # 下一页的页码
p.count # 总数据量
p.num_pages # 总分页数
p1.start_index # 该页第一个数据的索引
p1.end_index # 该页最后一个数据的索引
p1.object_list # 返回当前页所有数据
p1.has_other_pages # 是否含有其他页 返回True,False
{% for i in p1 %}
{{ i.name }}
{% endfor %}
{% for i in p.page_range %}
<a href="{% url '路由别名' %}?网页参数={{i}}"> {{i}} </a>
{% endfor %}
{% if p1.has_next %}
<a href='{% url '路由别名' %}?网页参数={{ p1.next_page_number }}'>下一页</a>
{% endif %}
上传图片:
file_path = name + ‘.’+path.name.spilt(’.’)[-1]
file = ‘img/’+file_path
import os
with open(os.path.join(STATICFILES_DIRS[0],file),‘wb’) as fp:
fp.write(path.read())
models.Course.objects.create(
name=name,
teacher=teacher,
path=file,
number=number
)
return redirect(’/index/’)