Django介绍
Django的Model模型介绍
每个模型都是django.db.models.Model的一个Python 子类。
模型的每个属性都表示为数据库中的一个字段。
模型与数据库的关系是orm关系(对象-关系-映射)
Django 提供一套自动生成的用于数据库访问的API;
Model的开发流程
1、在应用的model.py中定义模型类,要求继承自models.Model
2、把应用加入到项目settings.py配置文件的INSTALLED_APPS项中
3、生成迁移文件
python manage.py makemigrations
4、执行迁移
python manage.py migrate
5、使用模型类进行CRUD操作
model模型的实例
·模型的实例对象是通过objects属性获取的
·实例的方法:
__str__(self):重写object方法,此方法在将对象转换成字符串时会被调用
save( ):将模型对象保存到数据表中
delete( ):将模型对象从数据表中删除
创建并配置项目与应用
1、创建project
1 | diango-admin startproject mydemo |
2、创建应用
1 | python manage.py startapp myapp |
3、在mydemo文件下设置settings
1 | #激活模型,该虚线路径添加到该INSTALLED_APPS设置。 |
4、定义model模型
1 | from django.db import models |
属性的字段类型
AutoField:一个根据实际ID自动增长的IntegerField,通常不指定
如果不指定,一个主键字段将自动添加到模型中
BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput
NullBooleanField:支持null、true、false三种值
CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput
TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea
IntegerField:整数
DecimalField(max_digits=None, decimal_places=None):使用python的Decimal实例表示的十进制浮点数
DecimalField.max_digits:位数总数
DecimalField.decimal_places:小数点后的数字位数
FloatField:用Python的float实例来表示的浮点数
DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date实例表示的日期
参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键
auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果
TimeField:使用Python的datetime.time实例表示的时间,参数同DateField
DateTimeField:使用Python的datetime.datetime实例表示的日期和时间,参数同DateField
FileField:一个上传文件的字段
ImageField:继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是个有效的image
字段选项
通过字段选项,可以实现对字段的约束
在字段对象时通过关键字参数指定
null:如果为True,Django 将空值以NULL 存储到数据库中,默认值是 False
blank:如果为True,则该字段允许为空白,默认值是 False
对比:null是数据库范畴的概念,blank是表单验证证范畴的
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为 True, 则在表中会为此字段创建索引
default:默认值
primary_key:若为 True, 则该字段会成为模型的主键字段
unique:如果为 True, 这个字段在表中必须有唯一值
5、生成迁移文件,执行迁移
1 | #生成迁移文件 |
执行Model的操作
1、 配置mydeomodel中的路由文件,选择配置子路由文件的格式
1 | from django.urls import path,include |
python中函数加括号,调用此函数,返回return中的结果;函数不加括号,调用函数本身,可以理解为一个变量,指向函数代码所在的地址
2、在views.py中编写增删改查操作命令
1 | from django.shortcuts import render |
model的查询操作
- all() 查询所有数据
- filter() 过滤查询,查询部分数据
- exclude()
- order_by() 排序
- values():一个对象构成一个字典,然后构成一个列表返回
返回单个值的方法
- get():返回单个满足条件的对象
如果未找到会引发”模型类.DoesNotExist”异常
如果多条被返回,会引发”模型类.MultipleObjectsReturned”异常 - count():返回当前查询的总条数
- first():返回第一个对象
- last():返回最后一个对象
- exists():判断查询集中是否有数据,如果有则返回True
3、模板输出:
{% url 'indexusers' %}#动态生成rl地址,反向解析
{info}#直接输出
Django的视图层
Django框架中的视图(View)是用来负责处理用户请求和返回响应的逻辑程序
视图(View)简而言之就是一个Python的函数或方法,接受处理Web请求。
视图的响应可以是网页的HTML内容,重定向或404错误,XML文档或图像。
视图的代码按惯例是放置一个名为views.py
的文件中,此文件放在项目或应用程序目录中。
1、views请求设置
首先设置settings里ALLOWED_HOSTS = ['*']
,可以使所有的网址都能访问Django项目了。网页请求时会根据TEMPLATES中的'DIRS': [os.path.join(BASE_DIR,'templates')],
路径找到templates
文件加下的路由。然后在views里面设置响应return render(request,'myapp/index.html')
1 | TEMPLATES = [ |
2、<li><a href="{% url 'resp01' %}">1.一个简单的视图</a> </li>
中{% url 'resp01' %}
的名称跟
urls中路由设置中的name保持一致,并利用name值找到网页的请求地址(反向解析)。
3、HttpResponse响应html代码
1 | def resp01(request): |
4、重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置
1 | from django.shortcuts import redirect |
5、基于类的基本视图:
示例views.py:
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request, *args, **kwargs):
return HttpResponse('Hello, World!')
示例urls.py:
from django.urls import path
from myapp.views import MyView
urlpatterns = [
path('mine/', MyView.as_view(), name='my-view'),
]
# 其中as_view()是接受请求并返回响应的可调用视图['get', 'post', 'put', 'patch', 'delete, 'options'.]
6、set_cookie方法
Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。
服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
Cookies最典型的应用是判定注册用户是否已经登录网站
7、session方法–状态保持
HTTP协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
客户端与服务器端的一次通信,就是一次会话
实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
session方法把页面数据保存在服务端(数据库)上,实现跨页面访问当前请求者的数据。
Django 中session需要依赖数据库,因此需要确认数据库中是否存在 与session相关的表,如果数据库中没有session表,可以执行python manage.py migrate
数据结构迁移命令,创建session表。
1 | def resp06(request): |
7、HttpRequest对象
属性 :下面除非特别说明,属性都是只读的
path:一个字符串,表示请求的页面的完整路径,不包含域名
method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST’
encoding:一个字符串,表示提交的数据的编码方式: 一般为utf-8
GET:一个类似于字典的对象,包含get请求方式的所有参数
POST:一个类似于字典的对象,包含post请求方式的所有参数
FILES:一个类似于字典的对象,包含所有的上传文件
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
session:一个既可读又可写的类似于字典对象,表示当前会话,需Django 启用会话才可用。
方法:
is_ajax():如果请求是通过XMLHttpRequest发起的,则返回True
8、在编辑form表单的时候,如果是post(加密)提交,选择POST接受方式,如果是get(明文)提交,选择GET接受方式
1 | <form action="{% url 'updateusers' %}" method="post"> |
Django的模板层
在项目的settings.py配置文件中配置模板目录
‘DIRS’: [os.path.join(BASE_DIR,’templates’)],
在应用的视图文件加载模板,并放置要输出的数据
return render(request,“目录/模板文件.html”,{放置字典数据})
在模板文件中使用变量、标签和过滤器等输出信息
{{ 变量 }} {% 标签 %} {{ 变量|过滤器 }}
1、变量输出语法
当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
当模版引擎遇到点(“.”),会按照下列顺序查询:
字典查询,例如:foo[“bar”]
属性或方法查询,例如:foo.bar
数字索引查询,例如:foo[bar]1
2
3
4<li>{{name}}</li>
<li>{{stu.name}} {{stu.age}}</li>
a=[10,20,30]
<li>{{a.0}}</li>#不能写成a[0]如果变量不存在, 模版系统将插入’’ (空字符串)
在模板中调用方法时不能传递参数
2、标签
语法
{ % tag % }
1 | for标签 |
作用
- 在输出中创建文本
- 控制循环或逻辑
- 加载外部信息到模板中
3、过滤器
语法:
{ { 变量|过滤器 } },例如{ { name|lower } },表示将变量name的值变为小写输出
1 | 可以在if标签中使用过滤器结合运算符 |
- 使用管道符号 (|)来应用过滤器
- 通过使用过滤器来改变变量的计算结果
- 关闭HTML自动转义
网址:https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/#ref-templates-builtins-filters
4、注释
1 | 单行注释 |
5、模板运算
1 | 加 |
Django的模板继承
模板继承可以减少页面内容的重复定义,实现页面内容的重用
典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义
block标签:在父模板中预留区域,在子模板中填充
extends继承:继承,写在模板文件的第一行
定义父模板base.html
{ % block block_name % }
这里可以定义默认值
如果不定义默认值,则表示空字符串
{ % endblock % }
定义子模板index.html
{ % extends "base.html" % }
在子模板中使用block填充预留区域
{ % block block_name % }
实际填充内容
{ % endblock % }
说明
如果在模版中使用extends标签,它必须是模版中的第一个标签
不能在一个模版中定义多个相同名字的block标签
子模版不必定义全部父模版中的blocks,如果子模版没有定义block,则使用了父模版中的默认值
如果发现在模板中大量的复制内容,那就应该把内容移动到父模板中
使用可以获取父模板中block的内容
为了更好的可读性,可以给endblock标签一个名字
{ % block block_name % }
区域内容
{ % endblock block_name % }
Ajxa应用实战
- Ajax = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
- Ajax 不是新的编程语言,而是一种使用现有标准的新方法。
- Ajax 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
- 本次案例是使用jQuery实现一个城市级联信息加载实战
1、json数据类型
在 JSON 中,值必须是以下数据类型之一:
字符串
数字
对象(JSON 对象)
数组
布尔
Null
JSON 的值不可以是以下数据类型之一:
函数
日期
undefined
JSON 字符串
JSON 中的字符串必须用双引号包围。
实例
{ "name":"John" }
JSON 数字
JSON 中的数字必须是整数或浮点数。
实例
{ "age":30 }
JSON 对象
JSON 中的值可以是对象。
实例
{
"employee":{ "name":"Bill Gates", "age":62, "city":"Seattle" }
}
JSON 中作为值的对象必须遵守与 JSON 对象相同的规则。
JSON 数组
JSON 中的值可以是数组。
实例
{
"employees":[ "Bill", "Steve", "David" ]
}
JSON 布尔
JSON 中的值可以是 true/false。
实例
{ "sale":true }
JSON null
JSON 中的值可以是 null。
实例
{ "middlename":null }
2、配置静态资源目录
静态文件:项目中的CSS、图片、js都是静态文件
1 | 在settings设置最后中加入以下代码: |
在html中模板中使用static编码时,要在头部加上{ % load static from staticfiles % }