点击Django跳到阅读点
Django
下载网站
https://www.python.org/downloads/windows/
Django 是在快节奏的新闻编辑室环境中开发的,所以它旨在使常见的 Web 开发任务变得快速而简单
windows安装
-
在 Windows 上安装 Python 3.8 和 Django3.2.10
-
解压Django到文件夹,在进到解压目录,在cmd中运行
python setup.py install
-
等运行完,cmd测试是否成功
-
>python Python 3.8.7 >>> import django >>> django.get_version() '3.2.10' >>>
设计模式与模板层
MVC
MVC代表Model-View-Controller (模型-视图-控制器)模式。
- M 模型层(Model),主要用于对数据库层的封装
- V 视图层(View),用于向用户展示结果 (WHAT + HOW )
- C 控制(Controller ,用于处理请求、获取数据、返回结果(重要)
MTV
核心逻辑代码跳到V中
MTV代表Model-Template-View(模型-模板-视图)模式。
- M 模型层(Model)负责与数据库交互
- T 模板层(Template)负责呈现内容到浏览器(HOW)
- V 视图层(View)是核心,负责接收请求、获取数据、返回结果(WHAT)
M模型层
应用
应用在Django项目中是一个独立的业务模块,
可以包含自己的路由,视图,模板,模型
- 创建应用文件夹
- python manage.py startapp
name
- python manage.py startapp
- 安装此应用
- settings.py配置INSTALLED_APPS = [
name
, … , …]
- settings.py配置INSTALLED_APPS = [
├─name ''' 小MTV结构 '''
│ │ admin.py #管理
│ │ apps.py
│ │ models.py #数据库相关
│ │ tests.py
│ │ views.py #视图逻辑
│ │ __init__.py
│ │
│ └─migrations #数据库
│ __init__.py
分布式路由
Django中,
主路由配置文件(urls.py)可以不处理用户具体路由
,
主路由配置文件的可以做请求的分发
(分布式请求处理)。
具体的请求可以由各自的应用来进行处理
创建应用内的URLS
1 主路由中调用include函数,用于
将当前路由转到各个应用的路由配置文件的urlpatterns进行分布式处理
include('app名字.url模块名')
例如:
path('music/',include(music.urls)),
2 setting中添加应用(就是添加目录)
例如:
INSTALLED_APPS = [
'django.contrib.staticfiles',
'music',] #否则目录下的模板可能找不到
3 配置应用内urls.py
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index',views.index_view)
]
模板
应用内部可以配置模板目录
- 应用下手动创建templates文件夹
- settings.py中开启应用模板功能
- TEMPLATE 配置项中的
'APP_DIRS'值为True
即可
- TEMPLATE 配置项中的
- 应用下templates和外层templates都存在时,django得查找模板规则
- 1.优先查找外层templates目录下的模板
- 2.按INSTALLED_APPS配置下的应用顺序逐层查找
TEMPLATES = [
{
'APP_DIRS': True, }]
**模型
模型层,与数据库交互
什么是模型?
模型是一个Python类,它是由django.db.models.Model派生出的子类。
- 一个
模型类
代表数据库中的一张数据表
- 模型类中
每一个类属性
都代表数据库中的一个字段
。- 模型是数据交互的接口,是
表示和操作数据库的方法和方式
**ORM框架
ORM (Object Relational Mapping)即对象关系映射,
它是―种程序技术,
它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
建立模型类和表之间的对应关系
,允许通过面向对象的方式来操作数据库
。- 根据设计的模型类生成数据库中的表格。
- 通过
简单的配置就可以进行数据库的切换
。
优点:
只需要面向对象编程,不需要面向数据库编写代码.
对数据库的操作都转化成对类属性和方法的操作.
不用编写各种数据库的sql语句.
实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异.
不在关注用的是mysql、oracle...等数据库的内部细节.
简单的配置就可以轻松更换数据库.而不需要修改代码
缺点:
对于复杂业务,使用成本较高
根据对象的操作转换成SQL语句,根据查询的结果转化成对象,在映射过程中有性能损失.
映射关系
ORM | DB |
---|---|
类 | 数据表 |
对象 | 数据行 |
属性 | 字段 |
**模型创建
class模型类名(mode1s.Mode1) :
字段名= models.字段类型(字段选项)
1.创建app
python manage.py startapp bookstore
2.写模型models.py
'''from django.db import models
class Book(models.Model):
title = models.charFie1d("书名",max_length=50,default=' ')
price = models.DecimalFie1d('定价',max_digits=7,decimal_places=2,defau1t=0.0)
'''
3.数据库迁移
Django同步对模型所做更改(添加字段,删除模型等)到数据库模式的方式
(1)生成迁移文件-执行
# python manage.py makemigrations
将应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中
(2)执行迁移脚本程序-执行
# python manage.py migrate
执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库
#会生成很多表
Meta类
使用内部 Meta类来
给模型赋予属性
,Meta类下有很多内建的类性,可对模型类做一些控制
class Book(models.Model):
...
...
class Meta:
db_table='name?'
...
**模型使用
修改表结构在models.py
中修改
任何关于表结构的修改,务必在对应模型类上修改
修改后
python manage.py makemigrations python manage.py migrate
T模板层
- 1.模板是可以根据字典数据动态变化的html网页
- 2.模板可以根据视图中传递的字典数据动态生成相应的HTML网页。
模板配置
1.创建模板文件夹<项目名>/templates
2.在settings.py 中 TEMPLATES配置项
如果编译器找不到模板
-
- BACKEND:指定模板的引擎 - 接受视图,调用视图的实现,默认系统自带 - DIRS:模板的搜索目录 - 添加上自己创建的模板目录(可以是一个或多个) - APP_DIRS∶是否要在应用中的templates 文件夹中搜索模板文件 - OPTIONS∶有关模板的选项 配置项中需要修改部分 设置DIRS - 'DIRS'": [os.path.join(BASE_DIR, 'templates')],
加载模板
#template_view
from django.template import loader
#1.通过1oader加载模板‘
t = loader. get_template("模板文件名") #如test.html
# 2.将t转换成HTML字符串
html = t.render(字典数据)
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(htm1)
'''
from django.shortcuts import render
return render(request,"test.html",dict)
#请求,网页,字典
'''
#templates/test.html
<-- 可以用{
{变量名}}来引用模板传入的字典值 /-->
<!DOCTYPE html>
<html lang="zh-Hans">
<head> </head>
<body>
<h1> 这是模板 </h1>
</body>
</html>
模板变量
def mode_view(request):
dict={
"fruit":"apple",
"value":'10'
}
return render(request,"test1.html",dict)
传递类型
str int list tuple dict func odj
{
{
name}}#(变量名)
{
{
name.index}}
{
{
name.key}}
{
{
name.方法}}
{
{
函数名}}
模板标签
作用
- 将一些服务器端的功能嵌入到模板中,例如流程控制等
标签语法
if标签
{% if 表达式1 %}
.。。
{% elif 表达式2 %}
。。。
{% else 表达式3 %}
...
{% endif %}
for标签
{% for name in list %}
{
{name}}
{% endfor %}
过滤器
- 定义:在变量输出时对变量的值进行处理
- 作用:可以通过使用过滤器来改变变量的输出显示
- 语法∶{ { 变量|过滤器1:‘参数值1’|过滤器2:参数值2’…].}}
继承
模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块
#语法–父模板中:
定义父模板中的块 block标签标识出哪些在子模块中是允许被修改的
block标签:在父模板中定义,可以在子模板中覆盖
block标签外的不能改
#语法–子模板中:
继承模板extends标签(写在模板文件的第一行)
例如{
%extends 'base.html'%}
子模板重写父模板中的内容块
### block标签 ###
{
% block block_name %}
子模板块用来覆盖父模板中 block_name块的内容
{
% endblock block_name %}
静态文件
- 静态文件配置 settings.py中
配置静态文件的访问路径【该配置默认存在】
#通过哪个url地址找静态文件
STATIC_URL = '/static/'
说明:
指定访问静态文件时是需要通过/static/xxx
或http://127.0.0.1:8000/static/xxx
[xxx表示具体的静态资源位置]
#配置静态文件的存储路径STATICFILES DIRS
STATICFILES_DIRS保存的是静态文件在服务器端的存储位置
STATICFILES_DIRS = (
os.path.join(BASE_DIR,"static"),
)
模板中访问静态文件
- img标签为例
1.<img src=" /static/image/django2.jpg" width="200px"height="200px">
<img src="http://127.0.0.1:8000/static/image/django2.jpg">
2.通过{%static %}标签访问静态文件
加载static -
#放最上
{% load static %}
使用静态资源– {% static '静态资源路径'%}
样例
<img src="{% static 'images/lena.jpg'%}">
<body style="background-image: url({% static 'img/index.png' %});background-size: cover">
ORM模型CRUD
基本操作包括增删改查操作,即(CRUD操作)
CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)
ORM CRUD核心—>模型类.管理器对象(model.object. )
每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来。
这个对象叫管理器对象,数据库的增删改查可以通过模型的管理器实现
数据库设置
打开 mysite/settings.py
。这是个包含了 Django 项目设置的 Python 模块。
- 使用 SQLite 以外的数据库,请确认在使用前已经创建了数据库。
- 还要确保该数据库用户具有 “create database” 权限。
Django配置数据库有两种方法
方法一:直接在settings.py文件中添加数据库配置信息
DATABASES = {
# 方法一
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'mysite', # 数据库名称
'USER': 'xiaohong', # 数据库登录用户名
'PASSWORD': 'xiaohong', # 密码
'HOST': '127.0.0.1', # 数据库主机IP
'PORT': 3306, # 数据库端口号
}
}
`'django.db.backends.sqlite3'`
`'django.db.backends.postgresql'`
`'django.db.backends.mysql'`
`'django.db.backends.oracle'`
直接使用出错误
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
安装包
pip install pymysql
要在settings.py文件所在包中的__init__.py
中导入pymysql
import pymysql
pymysql.install_as_MySQLdb()
如何使用见·模型使用
方法二:将数据库配置信息存到一个文件中,在settings.py文件中将其引入。(推荐)
新建数据库配置文件my.cnf(名字随意选择)
[client]
database = blog
user = blog
password = blog
host =127.0.0.1
port = 3306
default-character-set = utf8
在settings.py文件中引入my.cnf文件
DATABASES = {
# 方法二:
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': 'utils/dbs/my.cnf',
},
}
}
字段类型
BooleanField()
数据库类型:tinyint(1) -- 编程语言中:使用true或False来表示值
在数据库中:使用1或0来表示具体的值
CharField()
数据库类型:varchar
注意:必须要指定max_length参数值
DateField()
数据库类型:date 表示日期√参数:
auto_now:每次保存对象时,自动设置该字段为当前时间(取值:True/False)
acto_now_add:当对象第一次被创建时自动设置当前时间(取值:True/False)
default:设置当前时间(取值:字符串格式时间如: '2019-6-1')。
以上三个参数只能多选一
DateTimeField()
数据库类型:datetime(6