一、Django框架介绍
01_ Django框架概念
- 软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品
- 框架的功能类似于 基础设施 ,提供并实现最为 基础的软件架构和体系
- 通常情况下依据框架来实现更为复杂的业务程序开发
- 二个字,框架就是程序的 骨架
02_Python 中常见的框架有哪些?
- 大包大揽 Django 被官方称之为完美主义者的Web框架
- 力求精简 web.py 和 Tornado
- 新生代微框架 Flask 和 Bottle
03_Django 框架介绍
- Django 是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。
- 由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需重新创建轮子。
- 免费的和开源的
- 被官方称之为完美主义者的Web框架
04_Django 框架的特点
05_Django 的安装
在线安装Django,指定版本安装 pip install django==2.2
豆瓣源:pip install Django -i https://pypi.douban.com/simple
06_快捷工具
实现python manage.py 自动补齐功能
二、后台管理
01_项目的创建与运行
项目目录结构如下图:
目录说明:
- manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互
内层的目录:项目的真正的Python包
- __init __.py :一个空文件,它告诉Python这个目录应该被看做一个Python包
- settings.py :项目的配置
- urls.py :项目的URL声明
- wsgi.py :项目与 WSGI 兼容的Web服务器入口
02_应用的创建和使用
1 创建第一个应用程序
Django 自带一个实用程序,可以自动生成应用程序的基本目录结构,因此可以专注于编写代码而不是创建目录。
在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
创建应用的命令:
python3 manage.py startapp bookApp
- BookManage中的外部网关接口wsgi.py接收用户请求
- 在BookManage/urls.py找到用户请求路径/book,以book开头的,读取bookApp中的子urls
- bookApp中的子urls中的book后未接其他,执行index视图函数
- view.py显示
2 路由规则
在BookManage/urls.py添加一条 url 规则
from django.contrib import admin
from django.urls import path, include
from bookApp.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', include('bookApp.urls')),
]
在 bookApp 目录中创建一个为 urls.py
from django.urls import path
from bookApp import views
urlpatterns = [
path(r'', views.index, name='index'),
]
3 编写视图函数
打开文件 bookApp/views.py 并放入以下Python代码
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def index(request):
print("用户请求的路径:;", request.path)
return HttpResponse('<h1 style="color:green">图书管理系统</h1>')
4 效果展示
启动服务器
python3 manage.py runserver
访问 url 地址: http:// 127.0.0.1:8000/book/ 如果看到主页内容 图书管理系统 即成功。
03_项目的数据库模型
1 创建数据库模型
models.Model
生成对应的数据库表 数据库表名为数据库名_类名
数据库表中默认存在id信息
bookApp/models.py
from django.db import models
"""
名词:
ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。
这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。
一对多关系:外键写在多的一端
book:hero = 1:n
"""
# Create your models here.
# 类对应数据库表, 表名称默认为bookApp_book.
class Book(models.Model):
# 属性对应数据库表的列名,默认会添加id这一列。
name = models.CharField(max_length=40, verbose_name="书籍名称")
pub_date = models.DateField(verbose_name="出版日期")
# 魔术方法,字符串友好展示, 便于调试代码
def __str__(self):
return self.name
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
# 单数时显示的名称
verbose_name = "图书管理"
# 复数时显示的名称
verbose_name_plural = verbose_name
"""
更多查询操作请参考网址: https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/
"""
# 类对应数据库表, 表名称默认为bookApp_hero.
class Hero(models.Model):
# 属性对应数据库表的列名,默认会添加id这一列。
gender_choice = [
(1, "男"),
(2, "女")
]
name = models.CharField(max_length=20, verbose_name="人物名称")
# 性别只能选择男(1)或者女(2)
gender = models.IntegerField(choices=gender_choice, verbose_name="性别") # 1, 2
content = models.TextField(max_length=1000, verbose_name="人物描述")
# 外键关联, 如果删除书籍时,相关hero对应的书籍设置为空。
book_id = models.ForeignKey(Book, on_delete=models.SET_NULL,
null=True, verbose_name="书籍id")
def __str__(self):
return self.name
# Meta选项的更多使用请参考网址: https://docs.djangoproject.com/zh-hans/3.1/ref/models/options/
# 自定义对应的表名,默认表名:bookApp_hero
class Meta:
# 单数时显示的名称
verbose_name = "人物管理"
# 复数时显示的名称
verbose_name_plural = verbose_name
2 生成数据库表
激活模型:编辑 BookManage/settings.py 文件,将应用加入到 INSTALLED_APPS 中
生成迁移文件
python manage.py makemigrations
产生的迁移文件如下:
执行迁移
python manage.py migrate
Datebase产生以下文件
4 数据库模型基本操作
进入交互式的Python shell,并使用 Django 提供的免费 API
python manage.py shell
引入需要的包:
from bookApp.models import Hero, Book
- 查看操作
查询所有图书信息:
Book.objects.all()
- 添加数据
- 搜索查看
- 删除
- List item
创建关联对象
from bookApp.models import Hero, Book
from datetime import date
接4.自定义模型加入后台管理
三、启用后台Admin 站点管理
双击db.sqlite3
数据库检测连接(只需要一个就可,此操作为当db为空,下载插件)
01_数据库迁移
使用这些 Django 自带的应用程序,需要我们在数据库中创建一些数据表对应,然后才能使用它们。
在终端terminal执行:
python manage.py makemigrations
python manage.py migrate
02_创建管理员用户
在终端terminal执行
按提示输入用户名、邮箱、密码
python manage.py createsuperuser
启动服务器,通过 “127.0.0.1:8000/admin” 访问,输入上面创建的用户名、密码完成登录
进入管理站点,默认可以对 groups、users 进行管理
03._管理界面本地化
编辑 settings.py 文件,设置编码、时区
LANGUAGE_CODE = ‘zh-Hans’
TIME_ZONE = ‘Asia/Shanghai’
接后台管理
04_自定义模型加入后台管理、自定义管理页面
自定义模型加入后台管理
打开 bookApp/admin.py 文件,注册模型
from django.contrib import admin
from models import Book
admin.site.register(Book)
加入自定义管理页面后:如下所示
from django.contrib import admin
from bookApp.models import Book,Hero
# 自定义后台站点管理的拓展阅读: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/admin/
# Register your models here.
#关联对象
#admin.StackedInline : 内嵌关联注册类
#admin.TabularInline : 表格 关联注册类
class HeroInline(admin.StackedInline):
model = Hero
extra = 3
# 书籍自定义管理页面
class BookAdmin(admin.ModelAdmin):
# 列表页展示的设置
list_display = ['id', 'name', 'pub_date']
list_filter = ['pub_date']
search_fields = ['name']
list_display_links = ['name']
list_per_page = 5
inlines = [HeroInline]
# 人物自定义管理页面
class HeroAdmin(admin.ModelAdmin):
# 列表页展示的设置
list_display = ['id', 'name', 'gender']
list_filter = ['gender']
search_fields = ['name', 'content']
list_display_links = ['name']
list_per_page = 5
# 增加和编辑页的设置
fieldsets = [('必填信息', {'fields': ['name', 'book_id']}),
('选填信息', {'fields': ['gender', 'content']}), ]
# 关联注册
admin.site.register(Book, BookAdmin)
admin.site.register(Hero, HeroAdmin)
列表页属性
- list_display:显示字段,可以点击列头进行排序
list_display = ['id', 'name', 'gender']
- list_filter:过滤字段,过滤框会出现在右侧
list_filter = ['gender']
- search_fields:搜索字段,搜索框会出现在上侧
search_fields = ['name', 'content']
- list_per_page:分页,分页框会出现在下侧
list_per_page = 5
添加、修改页属性
- fields:属性的先后顺序
fields = ['name', 'gender']
- fieldsets :属性分组, 注意: fields和fieldsets 只能设置一个.
fieldsets = [('必填信息', {'fields': ['name', 'book_id']}),
('选填信息', {'fields': ['gender', 'content']}), ]
关联对象
对于 Hero 模型类,有两种注册方式
- 方式一:与 Book 模型类相同
- 方式二:关联注册
admin.StackedInline : 内嵌关联注册类
admin.TabularInline : 表格 关联注册类
#关联对象
#admin.StackedInline : 内嵌关联注册类
#admin.TabularInline : 表格 关联注册类
class HeroInline(admin.StackedInline):
model = Hero
extra = 3
四、Django快速入门: 前台管理
01_URLconf 路由管理
- 在 Django 中,定义 URLconf 包括正则表达式、视图两部分 。
- Django 使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图 。
- 注意:只匹配路径部分,即除去域名、参数后的字符串 。
- 在主配置文件中添加子配置文件,使主 urlconf 配置连接到子模块的 urlconf 配置文件 。
BookManage/urls.py
from django.contrib import admin
from django.urls import path, include
from bookApp.views import index
urlpatterns = [
path('admin/', admin.site.urls),
# 当用户请求路径为/book/时,访问bookApp/urls.py子路由配置文件
path('book/', include('bookApp.urls')),
]
bookApp/urls.py
from django.urls import path
from bookApp import views
urlpatterns = [
# 当用户访问路径是book/, 执行views.index视图函数。
path(r'', views.index, name='index'),
# 显示书籍的详情页, 接收一个int值并赋值给id
path(r'<int:id>/', views.detail, name='detail'),
]
02_视图函数处理业务逻辑
- 在 Django 中,视图对WEB请求进行回应( response )。
- 视图接收 reqeust 请求对象作为第一个参数,包含了请求的信息 。
- 视图函数就是一个Python函数,被定义在 views.py 中 。
- 定义完成视图后,需要配置 urlconf ,否则无法处理请求。
bookApp/views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# 视图: 对用户的请求(request)进行业务逻辑操作,最终返回给用户一个响应(response).
from bookApp.models import Book
def index(request):
# print("用户请求的路径:", request.path)
books = Book.objects.all()
# 返回响应信息
# return HttpResponse(books)
# 渲染: 将上下文context{'books': books}填充到book/index.html代码的过程。
return render(request, 'book/index.html', {'books': books})
def detail(request, id):
"""书籍详情页信息"""
book = Book.objects.filter(id=id).first()
heros = book.hero_set.all()
return render(request, 'book/detail.html',
{'book': book, 'heros': heros})
主页与详情页前端HTML设计
在templates中建立book文件夹,在book文件夹里建detail.html和index.html
detail.html内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{book.name}}</h1>
<h1>{{book.pub_date}}</h1>
<h1>{{heros}}</h1>
</body>
</html>
index.html内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 style="color: blueviolet">图书管理系统</h1>
<ul>
{% for book in books %}
{# <li><a href="/book/{{ book.id }}/">{{ book.name }}</a></li>#}
<li><a href="/book/{{ book.id }}/">{{ book.name }}</a></li>
{% endfor %}
</ul>
</body>
</html>
03_模板管理实现好看的HTML页面
1. 模板语法: 变量
变量输出语法
{ { var } }
- 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出。
- 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。
- 当模版引擎遇到点("."),会按照下列顺序查询:
- 字典查询,例如: foo[“bar”]
- 属性或方法查询,例如: foo.bar
- 数字索引查询,例如: foo[bar]
- 如果变量不存在, 模版系统将插入’’ (空字符串)。
2.模板语法: 常用标签
语法:
{ % tag % }
作用:
- 在输出中创建文本。
- 控制循环或逻辑。
- 加载外部信息到模板中。
for标签:
{% for … in … %}
循环逻辑
{% endfor %}
if标签
{% if … %}
逻辑1
{% elif … %}
逻辑2
{% else %}
逻辑3
{% endif %}
comment标签
{% comment %}
多行注释
{% endcomment %}
include标签
- 加载模板并以标签内的参数渲染
{% include “base/left.html” %}
url :反向解析
{% url ‘name’ p1 p2 %}
csrf_token 标签
- 用于跨站请求伪造保护
{% csrf_token %}
五、HTML标签
01_标题标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>标题</h1>
<h2>标题</h2>
<h3>标题</h3>
<h4>标题</h4>
<h5>标题</h5>
<h6>标题</h6>
</body>
</html>
02_列表标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
/* 无序列表 */
<ul>
<li>book1</li>
<li>book2</li>
<li>book3</li>
<li>book4</li>
</ul>
/* 有序列表 */
<ol>
<li>book1</li>
<li>book2</li>
<li>book3</li>
<li>book4</li>
</ol>
</body>
</html>
03_图片标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img src="cat.jpg">
</body>
</html>
04_链接标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="https://www.baidu.com">百度一下</a>
<a href="https://www.baidu.com"><img src="cat.jpg"></a>
</body>
</html>
05_表格标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{# r: row #}
<table border="1">
<tr>
<td>主机名</td>
<td>IP</td>
</tr>
<tr>
<td>localhost</td>
<td>127.0.0.1</td>
</tr>
<tr>
<td>server1</td>
<td>127.0.0.1</td>
</tr>
</table>
</body>
</html>
06_表单标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
用户名: <input type="text" placeholder="username"><br/>
密码: <input type="password" placeholder="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>