快速入门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 自增ID AutoField 主键定义 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">«</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">»</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">«</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">»</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
})