七、分页和shell命令行模式
1、分页功能
1)新增或编辑博客内容
2)博客文章数较多–>全部加载过慢–>分页加载
为了夯实基础:shell模式、模型操作、模板标签、分页器
2、快速添加博客
因为现在只能通过后台新增博客,比较麻烦,所以考虑利用shell命令行模式添加博客
1)python manage.py shell
- for循环执行新增博客代码
进入项目目录cmd进入命令行模式–>激活虚拟环境–>打开shell命令行模式

3、模型新增对象
from blog.models import Blog
blog=Blog()
blog.title="***"
...
blog.save()
在shell模式下具体添加一篇博客

其中出错的地方比较多,因为我也是第一次使用,不太熟练
下面用for循环大批量添加博客

4、分页器实现分页
分页器:
from django.core.paginator import Paginator
paginator = Paginator(object_list, each_page_count)
page1 = paginator.page(1)

重新打开shell命令行,输入命令后,弹出警告,这个警告的意思是,我们的博客并没有按照一定顺序排列,分页之后也许会出现问题,解决方法是在models中添加排序
class Blog(models.Model):
title = models.CharField(max_length=50)
blog_type = models.ForeignKey(BlogType, on_delete=models.DO_NOTHING)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.DO_NOTHING)
created_time = models.DateTimeField(auto_now_add=True)
last_updated_time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "<Blog: %s>" % self.title
class Meta:
ordering = ['-created_time']
在Blog类后面追加了,按照时间排序,注意负号是按照最新发布的在前面排列,修改模型之后一定不要忘记同步数据库
python manage.py makemigtations(更新·迁移文件)
pyhon manage.py migrate(同步数据库)
下面重新进入shell执行同样的命令

这样就正常啦。
分页完成之后,下面就看一下分页器的一些方法

5、分页器的使用
前端:发送请求,请求打开具体分页内容
后端:处理请求,返回具体分页内容相应请求
url请求传递给后端的方式为?page=1这种形式
对blog_list方法进行改动
from django.core.paginator import Paginator
def blog_list(request):
blogs_all_list = Blog.objects.all() #获取所有对象
paginator = Paginator(blogs_all_list, 10) #所有对象每十个一页进行分页
page_num = request.GET.get('page', 1) #获取url的页面参数,默认返回第1页
page_of_blogs = paginator.get_page(page_num)
context = {}
context['page_of_blogs'] = page_of_blogs
context['blog_count'] = Blog.objects.all().count()
context['blog_types'] = BlogType.objects.all()
return render_to_response('blog/blog_list.html', context)
相应的前端代码为
<div class="panel panel-default">
<div class="panel-heading">{% block blog_list_title %}博客列表{% endblock %}(一共有{{ page_of_blogs.paginator.count }}篇博客)</div>
<div class="panel-body">
{% for blog in page_of_blogs %}
<div class="blog">
<h3>
<a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a>
</h3>
<p class="blog-info">
<span class="glyphicon glyphicon-tag" aria-hidden="true"></span><a href="{% url 'blogs_with_type' blog.blog_type.pk %}">{{blog.blog_type}}</a>
<span class="glyphicon glyphicon-time" aria-hidden="true"></span>{{blog.created_time|date:"Y-m-d"}}
</p>
<p>{{ blog.content|truncatechars:120 }}</p>
</div>
{% empty %}
<div class="blog">
<h3>暂无博客,敬请期待</h3>
</div>
{% endfor %}
</div>
</div>
{# 分页 #}
<div aria-label="Page navigation">
<ul class="pagination">
{# 有上一页才可以点击 #}
<li>
{% if page_of_blogs.has_previous %}
<a href="?page={{ page_of_blogs.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
{% else %}
<span aria-hidden="true">«</span>
{% endif %}
</li>
{# 显示全部页码 #}
{% for page_num in page_of_blogs.paginator.page_range %}
<li><a href="?page={{ page_num }}">{{ page_num }}</a></li>
{% endfor %}
{# 有下一页才可以点击 #}
<li>
{% if page_of_blogs.has_next %}
<a href="?page={{ page_of_blogs.next_page_number }}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
{% else %}
<span aria-hidden="true">»</span>
{% endif %}
</li>
</ul>
</div>
从后端传递的仅仅为一页的对象,所以才有 <div class="panel-heading">{% block blog_list_title %}博客列表{% endblock %}(一共有{{ page_of_blogs.paginator.count }}篇博客)</div>这样的改动
page_of_blogs.paginator.count是通过这一页找到上层的分页器,然后统计分页器里面的内容数目
下面 {% if page_of_blogs.has_previous %}在shell模式下dir(page1)展示的方法中有提及
{% for page_num in page_of_blogs.paginator.page_range %}中page_range同样在shell模式下有使用过
本文介绍如何在Django项目中实现博客内容的分页加载,以优化大量博客文章的显示速度,并探讨如何利用Shell命令行模式快速添加博客,包括模型操作和分页器的使用。
215

被折叠的 条评论
为什么被折叠?



