自学python 进击之路 - Django-模板层与ROM

295 阅读10分钟

src=http___5b0988e595225.cdn.sohucs.com_images_20190916_32ce26032b124c3cb145a4231627373d.jpeg&refer=http___5b0988e595225.cdn.sohucs.jpg..

静态文件

  • 静态文件配置-settings.py 中
    • 配置静态文件的访问路径【改配置默认存在】
      • 通过那个url地址找静态文件
      • STATIC_URL = '/static/'
      • 说明:
  • 配置静态文件的存储路径STATICFILES_DIRS STATICFILES_DIRS 保存的是静态文件在服务器端的存储位置
# file:setting.py
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static')
)
  • 模板中访问静态文件-img标签为例
    • 方案2
通过{%  static %}标签访问静态文件
1.加载static - {% load static %}
2.使用静态资源-{% static '静态资源路径'%}
3.样例
<img src='{% static 'imgage/xxx.jpg'%}'>
  • 小案例
    • 先创建新的项目
# 创建一个新的文件夹
mkdir django_03

# 创建新项目
django-admin startproject mysite3
  • 运行mysite3
python3 manage.py runserver 8888

Snipaste_2021-07-15_16-54-51.png

  • 修改配置
# mysite3 里面的 settings.py
# 1.我们先注释掉csrf ,因为当我们现在发一个怕post请求会触发csrf安全防范,会报403
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 2.配置DIRS
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 3.配置语言版本和时间
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
# 4. 配置STATICFILES_DIRS
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
  • 创建文件夹

Snipaste_2021-07-15_18-50-34.png

  • 创建视图
# views.py
from django.shortcuts import render


def test_static(request):
    return render(request, 'test_static.html')
  • 创建模板
# test_static.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试静态文件</title>
</head>
<body>
<!-- 绝对地址 -->
<img src="http://127.0.0.1:8888/static/image/django-01.jpg" alt="" width="300px" height="200px">

<!--相对地址-->
<img src="/static/image/django-01.jpg" alt="" width="300px" height="200px">


<!--django写法-->
{% load static %}
<img src="{% static 'image/django-01.jpg' %}" alt="" width="300px" height="200px">
</body>
</html>
  • 配置路由
# urls.py
path('test_static', veiws.test_static)

Snipaste_2021-07-15_19-18-18.png

Django 应用及分布式路由

应用

  • 应用在Django项目中是一个独立的业务模块,可以包含自己的路由,视图, 模板, 模型

创建应用

  • 步骤1
    • 用manage.py中的子命令 startapp 创建应用文件夹
python3 manage.py startapp xxxx
  • 步骤2
    • 在settings.py 的 INSTALLED_APPS 列表中配置安装此应用
# settings.py 配置样例
INSTALLED_APPS = [
   #...
   'user', # 用户信息模块
   'music' # 音乐模块
]

分布式路由

  • Djangoa中, 主路由配置文件(urls.py)可以不处理用户具体路由。主路由配置文件的可以做请求的分发(分布式请求处理)。具体的请求可以由各自的应用来进行处理

Snipaste_2021-07-15_20-03-37.png

  • 配置分布式路由
    • 骤1- 主路由中调用include函数
    • 语法:include('app名字.url模块名')
    • 作用:用于将当前路由转到各个应用的路由配置文件的urlpatterns进行分布式处理
    • 以http://127.0.0.1:8888/music/index为例

Snipaste_2021-07-15_20-20-28.png

  • 步骤2-应用下配置urls.py应用下手动创建urls.py文件内容结构同主路由完全一样

Snipaste_2021-07-15_20-42-48.png

  • 运行

Snipaste_2021-07-15_20-46-28.png

练习-配置分布式路由

  • 创建两个应用
    • 创建sport 应用,并且注册
python3 manage.py startapp sport
  • 创建news 应用,并注册
python3 manage.py startapp news

Snipaste_2021-07-15_21-09-58.png

  • 创建分布式路由系统
    • 配置主路由
   path('news/', include('news.urls')),
    path('sport/', include('sport.urls')),

Snipaste_2021-07-15_21-12-25.png

# 在sport文件下面创建urls.py
from django.urls import path
from . import views
urlpatterns = [
   path('index', views.index_view)
]
# 在news文件下面创建urls.py
from django.urls import path
from . import views
urlpatterns = [
   path('index', views.index_view)
]

应用下的模板

  • 应用内部可以配置模板目录
  1. 应用下手动创建templates文件夹
  2. settings.py 中开启应模板功能

TEMOLATE配置项中的'APP_DIRS'值为true即可

  1. 应用下templates和外层templates都存在时,django得查找模板规则 3.1 优先查找外层templates目录下的模板

3.2 INSTLLED_APP配置下的应用顺序逐层查找

  • 以news应用来举例子 1 .创建templates文件夹

Snipaste_2021-07-15_21-43-00.png 2. 在news文件下的views.py中创建视图

def index_view(request):
    # return HttpResponse('这是音频页')
    return render(request, 'news/index.html')
  1. 处理外层tempaltes文件夹同名文件出现NSTLLED_APP配置下的应用顺序逐层查找问题

Snipaste_2021-07-15_21-49-38.png

模型层及ORM介绍

模板层-定义

  • 模型层-负责跟数据之间进行通信

Django配置mysql

  • 创建数据库
  • 进去mysql数据库执行
    • create database 数据库名 default charset utf8
    • 通常数据库名跟项目名保持一致
  • settings.py 里进行数据库的配置
    • 修改DATABASES配置项的内容, 由sqlite3变为mysql

Snipaste_2021-07-16_14-12-17.png

# 在django项目里面配置mysql

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'mysite3',
        'USER':  'root',
        'PASSWORD': 'aa123456',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}
  • ENGINE-指定数据库存储引擎
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
'django.db.backends.postgresql'
  • NAME- 指定要连接的数据库的名称
  • USER -指定登录到数据库的用户名
  • PASSWORD - 数据库的密码
  • HOST/PORT - 连接具体数据库的ip 和端口

什么是模型

  • 模型是一个python类,他是由django.db.models.Model生出的子类
  • 一个模型类代表数据库中的一张数据表
  • 模型类中每一个类属性都代表数据库中的一个字段
  • 模型是数据交互的接口,是代表和操作数据库的方法和方式

ORM框架

  • 定义
    • ORM(object Relational Mapping) 即对象关系映射,它是一种程序技术 ,它允许你使用类和对象数据库进行操作,从而避免通过SQL语句操作数据库
  • 作用:
    • 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
    • 根据设计的模型类生成数据库中的表格
    • 通过简单的配置就可以进行数据库的切换
  • 优点
    • 只需要面向对象编程,不需要面向数据库编写代码
      • 对数据库的操作都转化成对类属性和方法的操作
      • 不用编写各种数据库的sql语句
    • 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
      • 不在关注同的是mysql。 oracle.... 等数据库的内部细节
      • 通过简单的配置就可以轻松更换数据库,而不需要修改代码
  • 缺点
    • 对于复杂业务,使用成本较高
    • 根据对象的操作转换成SQL语句,根据查询的结果传化成对象在映射过程中有性能损失
  • 映射图 Snipaste_2021-07-16_14-46-30.png
  • 模型示例
    • 此示例为添加一个bookstore_book 数据表来存放图书馆书目信息添加一个bookstore的app
      • 添加一个bookstore的app
    • 添加模型类并注册app
  • 数据库迁移
    • 迁移是django同步你对模型所做更改(添加字段, 删除模型等) 到你的数据库模式的方式
      • 生成迁移文件-执行 python3 manage.py makemigrations 将应用下的models.py 文件生成一个中间文件,并保存在migrations文件夹中

Snipaste_2021-07-16_15-47-22.png

  • 执行迁移脚本程序-执行 Python3 manage.py migrate 执行迁移程序实现迁移,将每个应用下的migrations目录的中间文件同步回数据库

Snipaste_2021-07-16_15-47-54.png

  • 模型类 -创建
from django.db import models

class 模型类名(models.Model):
   字段名 = models.字段类型(字段选项)
  • 移同步 makemigrations & migrate

04-ORM-基础字段及选项1

创建模型类流程

  • 任何关于结构的修改,务必在对应模型类上修改
  • 例:为bookstore_book表 添加一个名为info 的字段varchar(100)
    • 解决方案
      • 模型类中添加对应类属性
      • 执行数据库迁移
# 1.在bookstore应用的models.py添加字段
   info = models.CharField('描述', max_length=100, default='')
# 2. 数据库迁移(在终端运行)
python3 manage.py  makemigrations 
Python3 manage.py migrat
  • 查看数据库

Snipaste_2021-07-16_16-29-09.png

字段类型

  • BooleanField()

    • 数据库类型:tinyint(1)
    • 编程语言中:使用true或者False 来表示值
    • 在数据库中:使用1或0来表示具体的值
  • CharField()

    • 数据库类型:varchar
    • 注意:必须要指定max_length 参数值
  • DateField()

    • 数据库类型:date

    • 作用:表示日期

    • 参数:

      • 1.auto_now: 每次保存对象时,自动设置该字段为当前时间(取值:True/False)
      • 2.auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)
      • 3.default:设置当前时间(取值:字符串格式时间如:'2019-6-1')
  • DateTimeField()

    • 数据库类型:datetime(6)
    • 作用:表示日期和时间
    • 参数同DateField
  • FloatFieid()

    • 数据库类型:double
    • 编程语言中和数据库中都使用小数表示值
  • DecimalField()

    • 数据库类型:decimal(x ,y)

    • 编程语言中:使用小数表示该列的值

    • 在数据库中:使用小数

    • 参数:

      • max_digits:位数总数,包括小数点后的位数。该值必须大于等于decimal_placse
      • decimal_places: 小数点后的数字数量
  • EmailField()

    • 数据库类型:varchar
    • 编程语言和数据库中使用字符串
  • IntegerField()

    • 数据库类型:int
    • 编程语言和数据库中使用整数
  • ImageField()

    • 数据库类型:varchar(100)
    • 作用:在数据库中为了保存图片的路径
    • 编程语言和数据库中使用字符串
  • TextField()

    • 数据库类型:longtext
    • 作用:表示不定长的字符数据

创建模型类

  • 在bookstore/models.py 应用中添加一个模型类

  • Author- 作者

    • name - CharField 姓名 长度最大11
    • age - IntergerField 年龄
    • email - EmailField 邮箱
# bookstore/models.py

class Author(models.Model):
    name = models.CharField('姓名', max_length=11)
    age = models.IntegerField('年龄')
    email = models.EmailField('邮箱')
# 在终端运行命令迁移文件
python3 manage.py  makemigrations
Python3 manage.py migrate

Snipaste_2021-07-16_19-00-02.png 去mysql看看是否多一个表

Snipaste_2021-07-16_19-03-01.png

05-ORM-基础字段及选项2

模型类-字段选项

  • 字段选项,指定创建的列的额外的信息

  • 允许出现多个字段选项,多个选项之间使用,隔开

  • primary_key

    • 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数据库表不会创建id字段
  • blank

    • 设置为true时, 字段可以为空,设置为False时,字段是必须填写的
  • null

    • 如果设置为True , 表示该列值允许为空
    • 默认为False,如果此选项为False 建议加入default 选项来设置默认值
  • default

    • 设置所在列的默认值,如果字段选项null= False 建议添加此项
  • db_index

    • 如果设置为true,表示为该列增加索引
  • unique

    • 如果设置为True, 表示该字段在数据库中的值必须是唯一(不能重复出现的)
  • db_column

    • 指定列的名称,如果不指定的话采用属性名作为列名
  • verbose_name

    • 设置此字段在admin界面上的显示名称

字段选项例子

# 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
name = models.CharField(max_length=30, unique=true, null =False, db_index=True)

模型类-Meta类

  • Meta类-定义

    • 使用内部Meta类来给模型赋予属性, Meta类下有很多内键的类属性,可对模型做一些控制
    • 示例
# bookstore/ models.py
class Book(models.Model):
    title = models.CharField('书名', max_length=50, default='')
    price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)
    info = models.CharField('描述', max_length=100, default='')

    class Meta:
        db_table = 'book'
  • 迁移

Snipaste_2021-07-16_19-34-48.png

  • 查看数据库

Snipaste_2021-07-16_19-03-01.png

练习修改模型类

  • 1。模型类-BOOK 改成book

    • title-CharField(50) - 书名(唯一)
    • pud - CharField(100) - 出版社 (非空)
    • price-DecimalField - 图书定价 总价7/小数点2位
    • market_price - 图书零售价 总位7/小数点2位
    1. 模型类-Author (表名 author)

      • name - CharField(11) - 姓名(非空)
      • age- IntegerField - 年龄 默认值为1
      • email - EmailFiel - 邮箱 允许为空
  • 演示

# models.py

class Book(models.Model):
    title = models.CharField('书名', max_length=50, default='', unique=True)
    pud = models.CharField('出版社', max_length=100, default='')
    price = models.DecimalField('价格', max_digits=7, decimal_places=2, default=0.0)
    market_price = models.DecimalField('零售价', max_digits=7, decimal_places=2, default=0.0)

    class Meta:
        db_table = 'book'


class Author(models.Model):
    name = models.CharField('姓名', max_length=11)
    age = models.IntegerField('年龄', default=1)
    email = models.EmailField('邮箱', null=True)

    class Meta:
        db_table = 'author'
  • 迁移

Snipaste_2021-07-16_19-58-09.png

  • 查看mysql

Snipaste_2021-07-16_19-58-59.png

ORM-基本操作-创建数据

ORM-操作

  • 基本操作包括增删改查操作,即(CRUD操作)
  • CRUD是指在做计算处理时的增加(Create)、 读取查询(Read)、 更新(Update)和删除(Delete)
  • ORM CRUD 核心 - -》 模型类。管理器对象

创建数据

  • Django ORM 使用一种直观的方式把数据库表中的数据表示成pyhton对象

  • 创建数据中每一条记录就是创建一个数据对象

  • 方案一

    • MyModel.objects.cteate(属性1=值1, 属性2 = 值1..)

      • 成功:返回创建好的实体对象
      • 失败:抛出异常
  • 方案二

    • 创建MyModel 实例对象,并调用save()进行保存
obj = MyModel(属性 =值, 属性= 值)
obj.属性=值
obj.save()

Django Shell

  • 在Django 提供了一个交互式的操作项目叫Django Shell 他能够在交互模式用项目工程的代码执行响应的操作

  • 利用Django Shell 可以代替编写view的代码来进行直接操作

  • 注意:项目代码发生变化时,重新进入Django shell

  • 启动方式:

    • Python3 manage.py shell
  • 练习

    • 利用Django shell 给book 表添加如下数据
    • 图书信息

Snipaste_2021-07-16_20-51-35.png

Snipaste_2021-07-16_20-55-30.png 创建好后去查看mysql

Snipaste_2021-07-16_20-56-25.png