技术交流QQ群:1027579432,欢迎你的加入!

本教程来源于B站杨仕航Django2.0开发视频教程,如需转载,必须注明来源!

1.为什么先讲分页功能

2.快速添加新的博客

  • shell命令行模式下添加新博客:

    • python manage.py shell,如下图所示:
    • for循环执行新增博客代码
  • 添加一篇新的博客,涉及到Blog这个模型。因此在shell命令行模式下导入Blog这个模型。再用dir()方法来查看模型是否成功导入。如下图所示:
  • 查询现有博客情况,如下图中的方法:

3.模型新增对象

>>> from blog.models import Blog
>>>
>>>
>>>
>>> Blog.objects.all()
<QuerySet [<Blog: <Blog: 长内容的博客>>, <Blog: <Blog: 人物介绍>>, <Blog: <Blog: Django简
介>>]
>>> Blog.objects.all().count()
3
>>> blog = Blog()>>> Blog.objects.all()
<QuerySet [<Blog: <Blog: 长内容的博客>>, <Blog: <Blog: 人物介绍>>, <Blog: <Blog: Django简
介>>]>
>>> blog.title = "shell模式下的第一篇博客"
>>> blog.content = "这是一篇测试博客,233333333333333333333333333333333"
>>> from blog.models import BlogType
>>> dir()
['Blog', 'BlogType', '__builtins__', 'blog']>>> BlogType.objects.all()
<QuerySet [<BlogType: Django>, <BlogType: 随笔>, <BlogType: 感悟>]>>>> blog_type = BlogType.objects.all()[1]
>>> blog.blog_type = blog_type>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: CurryCoder>]>>>> User.objects.all()
<QuerySet [<User: CurryCoder>]>
>>> user = User.objects.all()[0]
>>> blog.author = user>>> blog.save()>>> Blog.objects.all()
<QuerySet [<Blog: <Blog: 长内容的博客>>, <Blog: <Blog: 人物介绍>>, <Blog: <Blog: Django简
介>>, <Blog: <Blog: shell模式下的第一篇博客>>]>
>>> Blog.objects.all().count()
4
<!-- 查询blog对象的方法和属性 -->
>>> dir(blog)
['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_check_column_name_clashes', '_check_field_name_clashes', '_check_fields', '_check_id_field', '_check_index_together', '_check_local_fields', '_check_long_column_names', '_check_m2m_through_same_relationship', '_check_managers', '_check_model', '_check_model_name_db_lookup_clashes', '_check_ordering', '_check_swappable', '_check_unique_together', '_do_insert', '_do_update', '_get_FIELD_display', '_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', '_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', '_save_parents', '_save_table', '_set_pk_val', '_state', 'author', 'author_id', 'blog_type', 'blog_type_id', 'check', 'clean', 'clean_fields', 'content', 'created_time', 'date_error_message', 'delete', 'from_db', 'full_clean', 'get_deferred_fields', 'get_next_by_created_time', 'get_next_by_last_updated_time', 'get_previous_by_created_time', 'get_previous_by_last_updated_time', 'id', 'last_updated_time', 'objects', 'pk', 'prepare_database_save', 'refresh_from_db', 'save', 'save_base', 'serializable_value', 'title', 'unique_error_message', 'validate_unique']
>>> blog.last_updated_time
datetime.datetime(2020, 5, 13, 13, 44, 45, 113603, tzinfo=<UTC>)
  • shell命令行模式下,快速添加大批量博客。具体效果如下如所示:

    >>> for i in range(1,31):
    ...   blog = Blog()
    ...   blog.title = "for %s" % i
    ...   blog.content = "这是for循环生成的第%s篇博客" % i
    ...   blog.blog_type = blog_type
    ...   blog.author = user
    ...   blog.save()
    ...
    ...
    >>> Blog.objects.all().count()
    34
    

4.分页器实现分页

  • 通过上图我们可以看出,当一下显示所有的博客时。因此实现分页功能,更便于我们查看想要浏览的博客

    >>> del Blog  # 删除某个模型
    >>> Blog
    Traceback (most recent call last):File "<console>", line 1, in <module>
    NameError: name 'Blog' is not defined
    >>> exit()
    >>> python manage.py shell
    >>> dir()
    ['__builtins__']
    >>> from django.core.paginator import Paginator
    >>> from blog.models import Blog
    >>> Blog.objects.all()
    <QuerySet [<Blog: <Blog: 长内容的博客>>, <Blog: <Blog: 人物介绍>>, <Blog: <Blog: Django简
    介>>, <Blog: <Blog: shell模式下的第一篇博客>>, <Blog: <Blog: for 1>>, <Blog: <Blog: for 2>
    >, <Blog: <Blog: for 3>>, <Blog: <Blog: for 4>>, <Blog: <Blog: for 5>>, <Blog: <Blog: for 6>>, <Blog: <Blog: for 7>>, <Blog: <Blog: for 8>>, <Blog: <Blog: for 9>>, <Blog: <Blog: for 10>>, <Blog: <Blog: for 11>>, <Blog: <Blog: for 12>>, <Blog: <Blog: for 13>>, <Blog: <Blog: for 14>>, <Blog: <Blog: for 15>>, <Blog: <Blog: for 16>>, '...(remaining elements truncated)...']>
    >>> blogs = Blog.objects.all()
    >>> blogs.count()
    34
    >>> paginator = Paginator(blogs, 10)
    <string>:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'blog.models.Blog'> QuerySet.
    
  • 出现上面的UnorderedObjectListWarning错误,这是由于没有设置分页后每一页按照什么顺序排序。因此打开blog目录下的models.py文件,在Blog类下添加Meta类如下所示:
    from django.db import models
    from django.contrib.auth.models import User# Create your models here.# 创建博文类型模型class BlogType(models.Model):type_name = models.CharField(max_length=15)def __str__(self):return self.type_name# 创建博文模型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=True)def __str__(self):return "<Blog: %s>" % self.title<!-- 添加的新内容 -->class Meta:ordering = ['-created_time']
    
  • 由于已经修改了Blog模型,所以要进行同步数据库。输入如下命令,如下图所示:
    E:\Django\mysite_env\Scripts\mysite
    $ python manage.py makemigrations
    Migrations for 'blog':blog\migrations\0003_auto_20200513_2224.py- Change Meta options on blogE:\Django\mysite_env\Scripts\mysite
    $ python manage.py migrate
    Operations to perform:Apply all migrations: admin, auth, blog, contenttypes, sessions
    Running migrations:Applying blog.0003_auto_20200513_2224... OKE:\Django\mysite_env\Scripts\mysite
    $ python manage.py runserver
    Performing system checks...System check identified no issues (0 silenced).
    May 13, 2020 - 22:24:47
    Django version 2.0, using settings 'mysite.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CTRL-BREAK.
    
  • 退出之前的shell命令行模型,重新进入shell命令行模式下,输入如下代码:
    >>> from django.core.paginator import Paginator
    >>> from blog.models import Blog
    >>> blogs = Blog.objects.all()
    >>> paginator = Paginator(blogs, 10)
    >>> paginator
    <django.core.paginator.Paginator object at 0x000000000469D978>
    >>> dir(paginator)
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_check_object_list_is_ordered', '_get_page', 'allow_empty_first_page', 'count', 'get_page', 'num_pages', 'object_list', 'orphans', 'page', 'page_range', 'per_page', 'validate_number']
    >>> paginator.__doc__
    >>> paginator.count
    34
    >>> paginator.num_pages
    4
    >>> paginator.page_range
    range(1, 5)
    >>>
    >>> page1 = paginator.page(1)
    >>> page1
    <Page 1 of 4>
    >>> dir(page1)
    ['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'count', 'end_index', 'has_next', 'has_other_pages', 'has_previous', 'index', 'next_page_number', 'number', 'object_list', 'paginator', 'previous_page_number', 'start_index']
    >>> page1.count
    <bound method Sequence.count of <Page 1 of 4>>
    >>> help(page1.count)
    Help on method count in module collections.abc:count(value) method of django.core.paginator.Page instanceS.count(value) -> integer -- return number of occurrences of value
    >>>
    >>> page1.object_list
    [<Blog: <Blog: for 30>>, <Blog: <Blog: for 29>>, <Blog: <Blog: for 28>>, <Blog: <Blog: for 27>>, <Blog: <Blog: for 26>>, <Blog: <Blog: for 25>>, <Blog: <Blog: for 24>>, <Blog: <Blog: for 23>>, <Blog: <Blog: for 22>>, <Blog: <Blog: for 21>>]
    >>> page1.object_list.count
    <built-in method count of list object at 0x00000000046AFDC8>
    

5.分页的使用

  • 前端页面:向后端服务器发送请求,请求打开具体的分页内容;
  • 后端服务器:处理请求,返回具体分页内容响应请求;
  • 例如,可以通过在浏览器中输入localhost:8000/blog/?page=1来访问第一页中的所有方法。因为前端通过url向服务器发送了GET请求,所以打开blog文件目录下的views.py文件,在blog_list()和blogs_with_type()函数中增加该请求对应的方法。views.py文件的内容如下:
    from django.shortcuts import render_to_response, get_object_or_404
    from django.core.paginator import Paginator
    from .models import Blog, BlogType
    # Create your views here.def blog_list(request):blogs_all_list = Blog.objects.all()paginator = Paginator(blogs_all_list, 10)  # 每10篇进行一次分页page_num = request.GET.get('page', 1)  # 获取url的页码参数(GET请求)page_of_blogs = paginator.get_page(page_num)context = {}context['blogs'] = page_of_blogs.object_listcontext['page_of_blogs'] = page_of_blogscontext['blog_types'] = BlogType.objects.all()return render_to_response('blog/blog_list.html', context)def blog_detail(request, blog_pk):context = {}context['blog'] = get_object_or_404(Blog, pk=blog_pk)return render_to_response('blog/blog_detail.html', context)def blogs_with_type(request, blog_type_pk):blogs_all_list = Blog.objects.all()paginator = Paginator(blogs_all_list, 2)  # 每2篇进行一次分页page_num = request.GET.get('page', 1)  # 获取url的页码参数(GET请求)page_of_blogs = paginator.get_page(page_num)context = {}blog_type = get_object_or_404(BlogType, pk=blog_type_pk)context['blog_type'] = blog_typecontext['blogs'] = Blog.objects.filter(blog_type=blog_type)context['blog_types'] = BlogType.objects.all()context['page_of_blogs'] = page_of_blogsreturn render_to_response('blog/blogs_with_type.html', context)
    
  • 接着,修改blog文件目录下的templates文件夹下的blog_list.html模板文件,经过views.py处理请求后,返回新的结果给前端页面。blog_list.html修改后的结果如下所示:
    {% extends 'base.html' %}
    {# blog_list.html文件内容 #}
    {# 页面标题 #}
    {% block title %}我的网站{% endblock %}
    {% block nav_blog_active %}active{% endblock %}{% load staticfiles %}
    {% block header_extends %}<link rel="stylesheet" href="{% static 'blog/blog.css' %}">
    {% endblock %}{# 页面内容 #}
    {% block content %}<div class="container"><div class="row"><div class="col-xs-12 col-sm-8 col-md-9 col-lg-10"><div class="panel panel-default"><div class="panel-heading">{% block blog_list_title %}博客列表(一共有{{ page_of_blogs.paginator.count }}篇博客){% endblock %}</div><div class="panel-body"><!-- 下一行中的blogs来自于views.py中的context['blogs'] = Blog.objects.all() -->{% for blog in blogs %}<div class="blog"><!-- 下一行中的blog.title来自于models.py中的title = models.CharField(max_length=50) --><h3><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h3><p class="blog-info"><span class="glyphicon glyphicon-tag"></span><a href="{% url 'blogs_with_type' blog.blog_type.pk %}">{{ blog.blog_type }}</a> &nbsp&nbsp&nbsp<span class="glyphicon glyphicon-time"></span>{{ blog.created_time|date:"Y-m-d" }}</p><p>{{ blog.content|truncatechars:120 }}</p></div>{% empty %}<div class="bog"><h3>暂无博客,敬请期待</h3></div>{% endfor %}</div></div><!-- 此处使用了bootstrp组件中的分页代码 --><div><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><div class="hidden-xs col-sm-4 col-md-3 col-lg-2"><div class="panel panel-default"><div class="panel-heading">博客分类</div><div class="panel-body"><ul class="blog-types">{% for blog_type in blog_types %}<li><a href="{% url 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a></li>{% empty %}<li>暂无分类</li>{% endfor %}</ul></div></div></div></div></div>{% endblock %}
    

13分页和shell命令行模式相关推荐

  1. 1005--HBase操作实战(HBase Shell命令行模式)

    通过HBase 命令行,创建一张表,用户存储用户信息,其中包括基本信息和额外信息HBase shell 下所有命令可以使用: help "cmd" 进行了解 1.创建表create ...

  2. QIIME 2用户文档. 22Python命令行模式(2019.7)

    前情提要 NBT:QIIME 2可重复.交互和扩展的微生物组数据分析平台 1简介和安装Introduction&Install 2插件工作流程概述Workflow 3老司机上路指南Experi ...

  3. (转)php-cli模式学习(PHP命令行模式)

    php-cli模式学习(PHP命令行模式) 之前知道php-cli模式是一种类似shell命令式的执行php程序,不过一直以为这个是一种落后的方式,应该没有什么意义,因为从没有遇到过使用这个cli模式 ...

  4. PHP 的命令行模式

    被安全模式限制或屏蔽的函数Built-in web server 特点 在线手册:中文 英文PHP手册 PHP 的命令行模式 Table of Contents Built-in web server ...

  5. linux 脚本编写基本命令,Linux Shell命令行及脚本编程实例详解

    <Linux典藏大系:Linux Shell命令行及脚本编程实例详解>共15章,分为两篇.主要内容包括:Linux 及Linux Shell简介.初识Linux Shell.常用Shell ...

  6. 2021年大数据Hadoop(八):HDFS的Shell命令行使用

    2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习. 有对大数据感兴趣的可以关注微信公众号:三帮大数据 目录 HDFS的Shell命 ...

  7. linux shell 宏定义_Linux系统和Shell命令行简介,走上数据分析之路

    122Linux系统和Shell命令行简介,走上数据分析之路 本节作者:刘永鑫 中国科学院遗传与发育生物学研究所 版本1.0.2,更新日期:2020年8月31日 本项目永久地址:https://git ...

  8. QIIME 2教程. 24Python命令行模式Artifact API(2021.2)

    Python命令行模式 Artifact API https://docs.qiime2.org/2021.2/interfaces/artifact-api/ 注:本指南假定您已执行"4人 ...

  9. QIIME 2教程. 24Python命令行模式Artifact API(2020.11)

    文章目录 Python命令行模式 译者简介 Reference 猜你喜欢 写在后面 Python命令行模式 Artifact API https://docs.qiime2.org/2020.11/i ...

最新文章

  1. C++核心编程(一)
  2. 11月Android笔记
  3. 架构师之路 — 软件架构 — 软件版本定义
  4. 图解在emu8086中学习汇编语言数字比较程序
  5. 为什么 wait 方法要在 synchronized 中调用?
  6. centos(linux) 下如何查看端口占用情况及杀死进程
  7. mormot数据库连接+查询+序列为JSON
  8. 面试奇葩——交换两变量值的一些邪门歪道
  9. 责任链模式 和观察者模式
  10. 小米申请雷军签名商标获批
  11. 8种提升ASP.NET Web API性能的方法
  12. SSIS包生成注意事项
  13. java使用密文链接数据库_Java基础——数据库连接信息使用密文
  14. 解决流氓软件自动下软件、自动弹窗、广告
  15. tar命令解压.zip文件出错:gzip: stdin has more than one entry--rest ignored
  16. keystore提取私钥和证书
  17. 如何为 Exchange 用户添加联系人头像
  18. List集合自定义排序!
  19. 用“网文快捕”破解不能复制文字的网站
  20. 电子邮件系统哪个好?分享2022电子邮件系统排名大全及主要功能

热门文章

  1. 个人博客三|首页后台开发
  2. shodan API 获取IP开放端口
  3. 利用Flutter写一个跨平台的果核APP(4)——数据存储
  4. 设备节点监听--走在 input 分析之前
  5. 系统间通信——dubbo
  6. 2个YUV视频拼接技术
  7. 用一条sql获取分组中最大值时的ID
  8. Lync server 2013 监控角色的安装
  9. strtok()思考
  10. linux查看硬件和系统信息的相关命令简介