快速入门django

快速入门django

初识django

django命令

  • 基本命令
命令用途
startapp启动一个django应用
startdjango启动一个django项目
check检查项目完整性
runserver本地简易运行django项目
shell进入django项目的python shell环境
test运行单元测试用例

-数据库相关命令

命令用途
makemigrations创建模型变更的迁移文件
migrate执行上一个命令创建的迁移文件
dumpdata把数据库数据导出到文件
loaddata把文件数据导入到数据库

创建一个项目

  • 使用django-admin startproject [文件名]创建项目

项目目录介绍

imoocdjangotest
├── .idea
│ ├── .gitignore
│ ├── imoocdjangotest.iml
│ ├── inspectionProfiles
│ │ ├── Project_Default.xml
│ │ └── profiles_settings.xml
│ ├── misc.xml
│ ├── modules.xml
│ └── workspace.xml
├── imoocdjangotest
│ ├── _init_.py
│ ├── settings.py django项目配置文件
│ ├── urls.py django路由文件
│ └── wsgi.py django作为wsgi应用一些所需文件内容
└── manage.py 项目管理文件

运行项目

在终端输入python manage.py runserver运行项目

django应用 VS django项目

  • 一个django项目就是一个基于django的web应用
  • 一个django应用就是一个可重用的python软件包
  • 每个django应用可以自己管理模型,视图,模板,路由和静态文件
  • 一个django项目包含一组配置和若干个django应用

django应用目录介绍

  • 在终端使用python manage.py startapp[文件名]命令创建应用
  • imoocdjangotest/blog
    ├── init.py
    ├── admin.py 定义admin模块管理对象
    ├── apps.py 声明应用
    ├── migrations
    │ └── init.py
    ├── models.py 定义应用模型
    ├── tests.py 编写应用测试用例
    ├── urls.py (自行创建)管理应用路由
    └── views.py 视图处理

django HelloWorld

  • django视图

    • 在blog/views.py中编写
    from django.http import HttpResponse
    
    def hello_world(request):
        """
    
        :type request: http请求的对象
        """
        #不能直接返回字符串,需要引入HttpResponse库进行对字符串封装
        return HttpResponse("HelloWorld")
    

    完成视图的编写后还不能进行访问,还需进行路由配置

  • django路由

    • 需要配置路由绑定视图函数和url

    • 分为两个层次

      • 应用层次

        在blog/urls.py中进行配置

        from django.urls import path, include
        
        # 导入视图文件
        import blog.views
        
        # 路由配置
        
        urlpatterns = [
            # 如果url中含有hello_world,就转发blog.view.hello_world
            # 注意转发的函数不带括号
            path('hello_world', blog.views.hello_world)
        ]
        
        
      • 项目层次

        在imoocdjangotest/urls.py中进行配置

        from django.urls import path,include
        
        urlpatterns = [
            path('admin/', admin.site.urls),
            # 添加blog路由
            # 如果url含有blog/字段,把他转发到应用层面的路由里面
            path('blog/',include('blog.urls'))
        
    • 将应用添加到配置文件中

      INSTALLED_APPS = [
      	.....,
      
          # 自己添加的app
          # BlogConfig是应用初始化时创建的应用配置
          # 将BlogConfig写在这里完成应用添加
          'blog.apps.BlogConfig',
      ]
      
      

初识django模型层

模型层是什么

  • 位于django视图层和数据库之间的组件
  • python对象和数据库表之间转换

为什么需要模型层

  • 屏蔽不同数据库之间的差异
  • 便于开发者更加专注于业务逻辑的开发
  • 提供很多便捷工具有助于开发

模型层相关配置

  • 在imoocdjangotest/settings.py中进行配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

创建博客文章模型

  • 设计博客模型

    • 模型层定义字段

      类型字段
      数字类型IntegerField
      文本类型TextField
      日期类型DateTimeFIeld
      自增IDAutoField
      主键定义primary_key属性
    • 模型定义

      在应用中进行定义

      在blog/models.py中进行定义

      class Article(models.Model):
          # 文章唯一ID
          article_id = models.AutoField(primary_key=True)
          # 文章标贴
          title = models.TextField()
          # 文章摘要
          brief_content = models.TextField()
          # 文章发布日期
          # auto_now:如果沒有指定发布日期默认为当点时间
          publish_date = models.DateTimeField(auto_now=True)
          # 文章内容
          content = models.TextField()
          # 完成模型定义
      

      下一步进行模型的迁移将模型定义保存到数据库中,在终端输入命令生成迁移文件

      in:python manage.py makemigrations
      out:Migrations for 'blog':
       	 blog\migrations\0001_initial.py
          	- Create model Article  
      

      接下来运行迁移文件,把迁移文件同步到数据库中

      python manage.py migrate
      

初识django shell

  • django shell 是什么

    • python shell,用于交互式的python编程
    • 便于调试一些简单语句
    • 继承django项目环境
  • 为什么使用django shell

    • 临时想操作使用django shell更加方便
    • 小范围debug更加简单,不需要运行整个项目来测试
  • django shell 使用

    在终端使用python manage.py shell进入django shell

    使用django shell 新建一篇文章

    # 导入文章模型
    >>> from blog.models import Artical
    >>> a = Artical()
    >>> a.title = 'test django shell'
    >>> a.brief_content = 'Test Django Shell'
    >>> a.content = 'test'
    >>> print(a)
    Artical object (None)
    # 保存新建
    >>> a.save()
    # 将数据库中总所有文章查询出来
    >>> articals = Article.object.all()
    >>> artical = articals[0]
    >>> print(artical.title)
    test django shell
    

初识django admin模块

  • django模块是什么

    • django自带的后台管理工具
    • 可以读取定义的模型元数据,提供强大的管理使用页面
  • 为什么需要django admin模块

    • django shell新增文章太复杂
    • 管理页面是基础设施中重要的部分
    • 认证用户,显示管理模型,效验输入等功能类似,admin模块避免了这些重复工作
  • django admin模块使用

    • 创建管理员用户

      在终端中输入python manage.py createsuperuser命令创建超级管理员用户

    • 登录页面进行管理

      在网址后加/admin进入管理员后台,输入管理员账号进行管理

      在使用admin后台管理模型前需要将模型进行注册

      在blog/admin.py中添加

      # 导入模型
      from .models import Article
      # 进行注册
      admin.site.register(Article)
      

      在admin中显示文章title

      在blog/models.py中添加

      class Article(models.Model):
      	……
          # 在admin后台中显示title
          def __str__(self):
              return self.title
      

实现博客数据返回页面

在blog/views.py中添加

# 引入模型
from blog.models import Article
# 创建一个视图函数返回博客文章内容
def article_content(request):
    article = Article.objects.all()[0]
    title = article.title
    brief_content = article.brief_content
    content = article.content
    article_id = article.publish_date
    publish_date = article.publish_date
    # 将以上信心整合冲字符串返回
    return_str = 'title : $s, brief_content : %s,' \
                 ' content : %s, article_id : %s' \
                 'publish_date : %s' % (title, brief_content, content, article_id, publish_date)
    return HttpResponse(return_str)

完成函数定义,还要在blog/urls.py中配置应用级路由

urlpatterns = [
    …………,
    path('content', blog.views.article_content)

]

还要在imoocdjangotest/urls.py配置项目及路由,之前添加过了就不用再添加了

初识django视图与模板

使用bootstrap实现静态博客页面

  • 页面布局设计

    • 博客首页

      在这里插入图片描述

    • 文章详情页

      在这里插入图片描述

  • bootstrap以及bootstrap的栅格系统

    • 来自Twitter的前端框架
    • 提供非常多的控件并附源码
    • 中文挂网[www.bootcss.con]
  • 创建页面

    在blog中创建templates目录

    • 博客首页

      在templates中新建一个html文件(index.html)

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>快速入门django</title>
          <!--引入bootstrap资源-->
          <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
                integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
      
          <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
                integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
      
          <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
          <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
                  integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
                  crossorigin="anonymous"></script>
      </head>
      <body>
      <!--定义头部-->
      <div class="container page-header">
          <h1>
              django入门
              <small>by spy</small>
          </h1>
      
      </div>
      <!--定义主要内容-->
      <div class="container page-body">
          <!--主要内容-->
          <!--md-9就是定义成九份-->
      
          <div class="col-md-9" role="main">
              <div class="body-main">
                  <div>
                      <h1>文章标题1</h1>
                      <p>1111111111111</p>
                  </div>
                  <div>
                      <h1>文章标题2</h1>
                      <p>1111111111111</p>
                  </div>
              </div>
          </div>
          <!--定义剩下3份-->
          <div class="col-md-3" role="complementary">
              <div>
                  <h2>最新文章</h2>
                  <h4><a href="#">最新文章1</a></h4>
                  <h4><a href="#">最新文章2</a></h4>
                  <h4><a href="#">最新文章3</a></h4>
                  <h4><a href="#">最新文章4</a></h4>
                  <h4><a href="#">最新文章5</a></h4>
                  <h4><a href="#">最新文章6</a></h4>
                  <h4><a href="#">最新文章7</a></h4>
                  <h4><a href="#">最新文章8</a></h4>
      
              </div>
          </div>
      </div>
      </body>
      </html>
      
    • 文章页面

      在templates中新建detail.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>快速入门django</title>
          <!--引入bootstrap资源-->
          <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
                integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
      
          <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
                integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
      
          <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
          <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
                  integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
                  crossorigin="anonymous"></script>
      </head>
      <body>
      <!--定义头部-->
      <div class="container page-header">
          <h1>
              文章标题1
          </h1>
      
      </div>
      <!--定义主要内容-->
      <div class="container body-main">
          <!--主要内容-->
                  <div>
                      <p>1111111111111</p>
                  </div>
          
      </div>
      </body>
      </html>
      

初识django模板系统

  • 模板系统简介

    • 视图文件不适合编码html
    • 使用视图文件进行编码时,页面设计改变需要修改python代码
    • 网页逻辑和网页视图应该分开设计
    • 使视图文件从html中解放出来
    • 模板系统的表现形式是文本
    • 分离文档的表现形式和表现内容
    • 模板系统 定义了特有的标签占位符
  • 基本语法

    标签语法示例
    变量{{变量}}在这里插入图片描述
    for循环{%for x in list %},{% endfor %}在这里插入图片描述
    if-else分支{% if %},{% else %},{% endif %}在这里插入图片描述

使用模板系统渲染博客页面

​ 在templates中新建blog文件夹,并将index.html和detail.html放入

  • 博客首页

    • <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>快速入门django</title>
          <!--引入bootstrap资源-->
          <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
                integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
      
          <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
                integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
      
          <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
          <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
                  integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
                  crossorigin="anonymous"></script>
      </head>
      <body>
      <!--定义头部-->
      <div class="container page-header">
          <h1>
              django入门
              <small>by spy</small>
          </h1>
      
      </div>
      <!--定义主要内容-->
      <div class="container page-body">
          <!--主要内容-->
          <!--md-9就是定义成九份-->
      
          <div class="col-md-9" role="main">
              <div class="body-main">
                  <!-- 使用for循环输出文章信息-->
                  <!-- article_list来自视图函数-->
                  {% for article in article_list %}
                      <div>
                          <h1>{{ article.title }}</h1>
                          <p>{{ article.brief_content }}</p>
                          <p>{{ article.content }}</p>
                      </div>
                  {% endfor %}
              </div>
          </div>
          <!--定义剩下3份-->
          <div class="col-md-3" role="complementary">
              <div>
                  <h2>最新文章</h2>
                  {% for article in article_list %}
                      <h4><a href="#">{{ article.title }}</a></h4>
                  {% endfor %}
              </div>
          </div>
      </div>
      </body>
      </html>
      
    • 在blog/views.py中创建视图函数

      def get_index_page(request):
          all_article = Article.objects.all()
          # render 把模板和数据进行渲染进行返回
          # 所需要的数据需要字典形式进行传入
          # 他会自动在templates下搜索路径
          return render(request, 'blog/index.html',
                        {
                            'article_list': all_article
                        })
      
      
    • 在blog/urls.py中配置路由

      
      urlpatterns = [
      	.....,
          path('index',blog.views.get_index_page)
      ]
      
  • 博客页面

    • <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>快速入门django</title>
          <!--引入bootstrap资源-->
          <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
                integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
      
          <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
                integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
      
          <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
          <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
                  integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
                  crossorigin="anonymous"></script>
      </head>
      <body>
      <!--定义头部-->
      <div class="container page-header">
          <h1>
              {{ curr_article.title }}
          </h1>
      
      </div>
      <!--定义主要内容-->
      <div class="container body-main">
          <!--主要内容-->
                  <div>
      
                      {% for section in section_list %}}
                          <p>{{ section }}</p>
                      {% endfor %}
                  </div>
      
      </div>
      </body>
      </html>
      
    • 在blog/views.py添加视图函数

      def get_detail_page(request):
          curr_article = Article.objects.all()[0]
          # 对文本信息做下优化
          section_list = curr_article.content.split('\n')
          return render(request,'blog/detail.html',
                        {
                            'curr_article': curr_article,
                            'section_list': section_list
                        })
      
    • 在blot/urls.py中添加路由

      urlpatterns = [
      	.....,
          path('detail',blog.views.get_detail_page)
      ]
      

实现文章详情页的跳转

  • 设计文章详情页的URL

    修改路由path参数

    urlpatterns = [
        ....,
        path('index',blog.views.get_index_page),
        # 传入参数
        path('detail/<int:article_id>',blog.views.get_detail_page)
    ]
    
    

    修改视图函数

    # 获取路径中的参数
    def get_detail_page(request, article_id):
        all_article = Article.objects.all()
        curr_article = None
        for article in all_article:
            if article.article_id == article_id:
                curr_article = article
                break
        # 对文本信息做下优化
        section_list = curr_article.content.split('\n')
        return render(request,'blog/detail.html',
                      {
                          'curr_article': curr_article,
                          'section_list': section_list
                      })
    
  • 实现首页的跳转

    • 对index.html进行改造’

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>快速入门django</title>
          <!--引入bootstrap资源-->
          <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
                integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
      
          <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
          <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
                integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
      
          <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
          <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
                  integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
                  crossorigin="anonymous"></script>
      </head>
      <body>
      <!--定义头部-->
      <div class="container page-header">
          <h1>
              django入门
              <small>by spy</small>
          </h1>
      
      </div>
      <!--定义主要内容-->
      <div class="container page-body">
          <!--主要内容-->
          <!--md-9就是定义成九份-->
      
          <div class="col-md-9" role="main">
              <div class="body-main">
                  <!-- 使用for循环输出文章信息-->
                  <!-- article_list来自视图函数-->
                  {% for article in article_list %}
                      <div>
                          <!-- 在这里修改-->
                          <h1><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h1>
                          <p>{{ article.brief_content }}</p>
                          <p>{{ article.content }}</p>
                      </div>
                  {% endfor %}
              </div>
          </div>
          <!--定义剩下3份-->
          <div class="col-md-3" role="complementary">
              <div>
                  <h2>最新文章</h2>
                  {% for article in article_list %}
                      <!-- 在这里修改-->
                      <h4><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h4>
                  {% endfor %}
              </div>
          </div>
      </div>
      </body>
      </html>
      

实现上下篇文章跳转

  • 去bootstrap中文官网挑选相关组件

  • 将复制的代码添加到detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>快速入门django</title>
    <!--引入bootstrap资源-->
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
          integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
            crossorigin="anonymous"></script>
</head>
<body>
<!--定义头部-->
<div class="container page-header">
    <h1>
        {{ curr_article.title }}
    </h1>

</div>
<!--定义主要内容-->
<div class="container body-main">
    <!--主要内容-->
    <div>

        {% for section in section_list %}}
            <p>{{ section }}</p>
        {% endfor %}
    </div>
    <!--这这里修改-->
    <div>
        <nav aria-label="...">
            <ul class="pager">
                <li><a href="/blog/detail/{{ previous_article.article_id }}">上一篇:{{ previous_article.title }}</a></li>
                <li><a href="/blog/detail/{{ next_article.article_id }}">下一篇:{{ next_article.title }}</a></li>
            </ul>
        </nav>
    </div>
</div>
</body>
</html>
  • 修改视图函数

    # 获取路径中的参数
    def get_detail_page(request, article_id):
        all_article = Article.objects.all()
        curr_article = None
        previous_index = 0
        next_index = 0
        previous_article = None
        next_article = None
        for index, article in enumerate(all_article):
            if index == 0:
                previous_index = 0
                next_index = index + 1
            elif index == len(all_article) - 1:
                previous_index = index - 1
                next_index = index
            else:
                previous_index = index - 1
                next_index = index + 1
            if article.article_id == article_id:
                curr_article = article
                previous_article = all_article[previous_index]
                next_article = all_article[next_index]
                break
    
        # 对文本信息做下优化
        section_list = curr_article.content.split('\n')
        return render(request, 'blog/detail.html',
                      {
                          'curr_article': curr_article,
                          'section_list': section_list,
                          'previous_article': previous_article,
                          'next_article': next_article
                      })
    
    

实现分页功能

导入分页组件
>>> from django.core.paginator import Paginator
>>> l = [1,2,3,4,5,6]1:列表,2:一页几个
>>>p = Paginator(l,2)
输出页数
>>>p.num_pages
2
p中的个数
>>>p.count
6
>>> page1 = p.page(1)
>>> page1.object_list
[1,2]
是否还有下一页
>>>page1.has_next()
True
是否有上一页
>>>page1.has_previous()
False
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>快速入门django</title>
    <!--引入bootstrap资源-->
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
          integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
            crossorigin="anonymous"></script>
</head>
<body>
<!--定义头部-->
<div class="container page-header">
    <h1>
        django入门
        <small>by spy</small>
    </h1>

</div>
<!--定义主要内容-->
<div class="container page-body">
    <!--主要内容-->
    <!--md-9就是定义成九份-->

    <div class="col-md-9" role="main">
        <div class="body-main">
            <!-- 使用for循环输出文章信息-->
            <!-- article_list来自视图函数-->
            {% for article in article_list %}
                <div>
                    <!-- 在这里修改-->
                    <h1><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h1>
                    <p>{{ article.brief_content }}</p>
                    <p>{{ article.content }}</p>
                </div>
            {% endfor %}
        </div>
        <!--在这里添加分页按钮-->
        <!--把这个快定义为底部分页-->
        <div class="body-footer">
            <!--占5列,右偏3-->
            <div class="col-md-5 col-md-offset-3">
                <nav aria-label="Page navigation">
                    <ul class="pagination">
                        <li>
                            <a href="/blog/index?path={{ previous_page }}" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                        {% for num in page_num %}
                        <li><a href="/blog/index?page={{ num }}">{{ num }}</a></li>
                        {% endfor %}
                        <li>
                            <a href="/blog/index?page={{ next_page }}" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    </ul>
                </nav>
            </div>
        </div>
    </div>
    <!--定义剩下3份-->
    <div class="col-md-3" role="complementary">
        <div>
            <h2>最新文章</h2>
            {% for article in article_list %}
                <!-- 在这里修改-->
                <h4><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h4>
            {% endfor %}
        </div>
    </div>
</div>
</body>
</html>

修改后的视图函数

def get_index_page(request):
    # 页数获取
    page = request.GET.get('page')
    if page:
        page = int(page)
    else:
        page = 1
    all_article = Article.objects.all()
    # 使用分页组件
    paginator = Paginator(all_article, 3)
    page_num = paginator.num_pages
    page_article_list = paginator.page(page)
    if page_article_list.has_next():
        next_page = page + 1
    else:
        next_page = page
    if page_article_list.has_previous():
        previous_page = page - 1
    else:
        previous_page = page
    # render 把模板和数据进行渲染进行返回
    # 所需要的数据需要字典形式进行传入
    # 他会自动在templates下搜索路径
    return render(request, 'blog/index.html',
                  {
                      'article_list': all_article,
                      'page_num': range(1, page_num + 1),
                      'curr_page': page,
                      'next_page': next_page,
                      'previous_page': previous_page
                  })


实现最近文章列表

修改后的html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>快速入门django</title>
    <!--引入bootstrap资源-->
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
          integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

    <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css"
          integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
            integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
            crossorigin="anonymous"></script>
</head>
<body>
<!--定义头部-->
<div class="container page-header">
    <h1>
        django入门
        <small>by spy</small>
    </h1>

</div>
<!--定义主要内容-->
<div class="container page-body">
    <!--主要内容-->
    <!--md-9就是定义成九份-->

    <div class="col-md-9" role="main">
        <div class="body-main">
            <!-- 使用for循环输出文章信息-->
            <!-- article_list来自视图函数-->
            {% for article in article_list %}
                <div>
                    <!-- 在这里修改-->
                    <h1><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h1>
                    <p>{{ article.brief_content }}</p>
                    <p>{{ article.content }}</p>
                </div>
            {% endfor %}
        </div>
        <!--在这里添加分页按钮-->
        <!--把这个快定义为底部分页-->
        <div class="body-footer">
            <!--占5列,右偏3-->
            <div class="col-md-5 col-md-offset-3">
                <nav aria-label="Page navigation">
                    <ul class="pagination">
                        <li>
                            <a href="/blog/index?path={{ previous_page }}" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                        {% for num in page_num %}
                            <li><a href="/blog/index?page={{ num }}">{{ num }}</a></li>
                        {% endfor %}
                        <li>
                            <a href="/blog/index?page={{ next_page }}" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    </ul>
                </nav>
            </div>
        </div>
    </div>
    <!--定义剩下3份-->
    <div class="col-md-3" role="complementary">
        <div>
            <h2>最新文章</h2>
            <!--实现最近五篇-->
            {% for article in top5_article_list %}
                <!-- 在这里修改-->
                <h4><a href="/blog/detail/{{ article.article_id }}">{{ article.title }}</a></h4>
            {% endfor %}
        </div>
    </div>
</div>
</body>
</html>

修改后的视图函数


def get_index_page(request):
    # 页数获取
    page = request.GET.get('page')
    if page:
        page = int(page)
    else:
        page = 1
    all_article = Article.objects.all()
    # 实现最近文章功能
    # 减号表示倒叙排序
    top5_article_list = Article.objects.order_by('-publish_date')[:5]
    # 使用分页组件
    paginator = Paginator(all_article, 3)
    page_num = paginator.num_pages
    page_article_list = paginator.page(page)
    if page_article_list.has_next():
        next_page = page + 1
    else:
        next_page = page
    if page_article_list.has_previous():
        previous_page = page - 1
    else:
        previous_page = page
    # render 把模板和数据进行渲染进行返回
    # 所需要的数据需要字典形式进行传入
    # 他会自动在templates下搜索路径
    return render(request, 'blog/index.html',
                  {
                      'article_list': all_article,
                      'page_num': range(1, page_num + 1),
                      'curr_page': page,
                      'next_page': next_page,
                      'previous_page': previous_page,
                      'top5_article_list': top5_article_list
                  })



def get_index_page(request):
    # 页数获取
    page = request.GET.get('page')
    if page:
        page = int(page)
    else:
        page = 1
    all_article = Article.objects.all()
    # 实现最近文章功能
    # 减号表示倒叙排序
    top5_article_list = Article.objects.order_by('-publish_date')[:5]
    # 使用分页组件
    paginator = Paginator(all_article, 3)
    page_num = paginator.num_pages
    page_article_list = paginator.page(page)
    if page_article_list.has_next():
        next_page = page + 1
    else:
        next_page = page
    if page_article_list.has_previous():
        previous_page = page - 1
    else:
        previous_page = page
    # render 把模板和数据进行渲染进行返回
    # 所需要的数据需要字典形式进行传入
    # 他会自动在templates下搜索路径
    return render(request, 'blog/index.html',
                  {
                      'article_list': all_article,
                      'page_num': range(1, page_num + 1),
                      'curr_page': page,
                      'next_page': next_page,
                      'previous_page': previous_page,
                      'top5_article_list': top5_article_list
                  })


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值