从零开始的django开发生活之分页功能和shell命令行模式(7)

本文介绍如何在Django项目中实现博客内容的分页加载,以优化大量博客文章的显示速度,并探讨如何利用Shell命令行模式快速添加博客,包括模型操作和分页器的使用。

七、分页和shell命令行模式

1、分页功能

1)新增或编辑博客内容

2)博客文章数较多–>全部加载过慢–>分页加载

为了夯实基础:shell模式、模型操作、模板标签、分页器

2、快速添加博客

因为现在只能通过后台新增博客,比较麻烦,所以考虑利用shell命令行模式添加博客

1)python manage.py shell

  1. 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">&laquo;</span>
                      </a>
                    {% else %}
                        <span aria-hidden="true">&laquo;</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">&raquo;</span>
                        </a>
                    {% else %}
                        <span aria-hidden="true">&raquo;</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模式下有使用过

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值