Django-笔记

Django 框架

1、软件框架:是由其中的各个软件模块组成的,每一个模块都有特定的功能
2、MVC 框架:
产生理念:分工,让专门的人去做专门的事
核心思想:解耦
M:Model 模型 和数据库进行交互
V:View 视图 产生html 页面
C:Controller 控制器,接受请求,进行处理,与 M 和 V 交互返回答应
3、MVT
M:Model 模型
V: View 视图(和 MVC 中 c 相同,)
T: Temlate 模板 (和MVC中V相同,产生html页面)

快速开发 和DRF 原则
4、虚拟环境
虚拟环境是真是python 环境的复制环境
创建虚拟环境命令(mkvirtualenv 虚拟环境名)
创建python3 虚拟环境:mkvirtualenv -p python3 bj11_py3
进入虚拟环境工作:workon 虚拟环境名
查看机器上有多少个虚拟环境:workon 空格 + 两个tab键
退出虚拟环境:deactivate
删除虚拟环境:rmvirtualenv 虚拟环境名
pip list(查看安装的包)
pip install 包(==版本号)
pip freeze
5、项目创建
1、安装django(用命令行添加)
2、在D:pythonpython374Scripts 路径下的命令行 输入django-admin startproject test1
3、目录就创建在D:pythonpython374Scripts

目录包括:
__init__.py:说明test1 是一个python包
setting.py: 项目的配置文件
urls.py: 进行url路由的配置
wsgi.py:web 服务器和Django交互的入口
manage.py: 项目的管理文件
(在目录中使用命令行:python manage.py startapp booktest)
Django 开发中一个模块一个应用

__init__.py:说明目录是一个python 模块
models.py: 写和数据库相关的内容
views.py: 定义处理函数,视图函数
tests.py: 写测试代码的文件
admin.py: 网站的后台管理文件

建立应用和项目之间的练习,需要对应用进行注册
在test 文件下的settings.py 中 INSTALLED_APPS 列表后面添加
'booktest', #进行应用的注册

运行开发web服务器命令:
python manage.py runserver(如果有报错请执行 python manage.py migrate)
6、ORM
O:Object 对象类
R:Relations 关系、数据库中表
M:Mapping: 映射

ORM 另外一个作用:根据设计的类生成数据库中的表

模型类生成表
1) 生成迁移文件
命令: python manage.py makemigrations
2) 执行迁移生成表
命令:python manage.py migrate

3) 通过模型类操作数据表
命令:python manage.py shell

然后通过实例化操作数据
from booktest.models import BookInfo
b = BookInfo() # 实例化
b.btitle = '天龙八部'
from datetime import date
b.bpub_date = date(1990,1,1)
b.save() # 保存

# 查询
b2 = BookInfo.objects.get(ID=1)# 查找ID = 1的数据
type(b2)
b2.title # 查看列
b2.bpub_date

# 修改数据
b2.bpub_date= date(1990,10,10)
b2.save()

#删除
b2.delete()

设置外键
hbook = models.ForeignKey(to='BookInfo', on_delete=models.CASCADE)

如何查看跟一本图书关联的
b.heroinfo_set.all()#小写, 由一查多
h.hbook #由多查一

BookInfo.objects.all() # 查询图书表里面的所有内容

后台管理
1)本地化--语言和时区的本地化, 修改项目的settings.py
age: LANGUAGE_CODE = 'en-us' -->LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC' -->TIME_ZONE = 'Asia/Shanghai'
2)创建管理员
命令:python manage.py createsuperuser
然后输入:
用户名:fu
电子邮箱:1024238316@qq.com
密码:fu13460517032
然后启动服务器(命令):python manage.py runserver
3)注册模型类
在应用下的admin.py 中注册模型类
告诉Django 框架 根据注册的模型类来生成对应的表管理页面
b = BookInfo()

#修改显示的内容 在models下添加函数
def __str__(self):
# 返回书名
return self.hname

4、自定义管理页面(admin)
自定义模型管理类:告诉Django 在生成的管理页面上显示那些内容

--------上面是M------------
--------下面是V------------
视图:在Django 中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求,
视图函数处理之后,要给浏览器返回这个页面的内容

视图函数的使用:
1)定义视图函数:视图函数定义在view.py 中
def index2(request):
# 进行处理,和M 和T进行交互
return HttpResponse('Hello, python!')
视图函数必须有一个参数 ruquest, 进行处理之后,需要返回一个HttpResponse雷的对象,Hello, python!就是返回给显示器的内容
2)进行url 配置
urlpatterns = [url(r'^index$', views.index), # 建立/index 和视图之间的关系
url(r'^index2$', views.index2),]
一、所有的url配置项都定义在一个叫做urlpatterns的列表中
二、每一个配置项都会调用url函数,第一个参数是正则表达式,第二个参数是对应的处理动作,可以写一个视图函数的名字
三、和url字符串进行正则匹配,匹配成功则执行其后对应的处理动作
四、工作对应的动作可以是一个视图函数的名字,也可以是包含一个应用的urls.py

url 匹配过程
在项目的url.py 文件中包含具体应用的urls.py 文件,应用的 url.py 文件中写url 和视图函数的对应关系

模板
模板:不仅仅是一个html 文件
模板文件的使用
1)创建模板文件夹(在根目录中创建 Directory 文件夹,命名为 templates)
2)配置模板目录(在settings中TEMPLATES--> 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 设置目录)
3)只用模板文件
a) 加载模板文件
去模板目录下面获取html文件的内容,得到一个模板对象
b)定义模板上下文
向模板文件传递数据
c)模板渲染
得到一个标准的html内容

给模板文件传递数据
模板变量使用:{{模板变量名}}
模板代码段:{%代码段%}
for 循环:
{%for i in list%}
<li>{{i}}</li>
{% endfor %}

模型M:
1、Django ORM
2、Django 数据库配置
2.1 mysql 命令回顾
登入mysql 数据库:mysql -uroot -p
查看有哪些数据库:show databases
创建数据库:create database test2 charset=utf8; # 切记:指定编码
使用数据库:use test2;
查看数据库中的表: show tables;
2.2 Djanogo 配置使用 mysql 数据库
修改 settings.py 中的DATABASES
DATEBASES = {
'default':{
#'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql', #使用mysql 数据库
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'test2', # 使用的数据库名字
'USER': 'root', # mysql数据库的用户名
'PASSWORD':'root', #数据库的登入密码
'HOST':'localhost', '数据库所在主机'
'PORT':3306, #数据库端口号
}
}
# 在python3 中需要安装pymysql
# 安装之后,需要在test2/__init__.py 中加如下内容:
import pymysql
pymysql.install_as_MySQLdb()
# 模型 M
# 1、 在Django的安装目录(D:pythonpython374Scripts)下打开命令行
# 输入django-admin startproject test2 #test2为项目名
# 2、在新建的test2 目录(D:pythonpython374Scripts est2)下打开命令行
# 输入python manage.py startapp booktest #booktest 为应用
# 3、用pycharm 打开我们新建的项目--> 在项目名中setting 添加注册应用 和修改数据库
# INSTALLED_APPS 中添加 'booktest', #注册应用
# DATABASES 中更改数据库如下:(默认为SQLite)
# DATABASES = {
# 'default': {
# # 'ENGINE': 'django.db.backends.sqlite3',
# 'ENGINE': 'django.db.backends.mysql',
# #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# 'NAME': 'fu', # 使用数据库的名字
# 'USER':'root', #链接mysql的用户名
# 'PASSWOED':'', #用户对应的密码
# 'HOST':'localhost', #指定mysql 数据库所在电脑IP
# 'PORT':3306, # mysql 服务
# }
# }
# 4、在test2中__init__.py 文件下添加
# import pymysql
# pymysql.install_as_MySQLdb()


# 5、在模型 booktest->migrations->models.py 中声明类(如下):
'''
class BookInfo(models.Model):
#图书模型类
# 图书名称
btitle = models.CharField(max_length=20)
# 出版日期
bpub_date = models.DateField()
# 阅读量
bread = models.BooleanField(default=False)
# 评论量
bcomment = models.IntegerField(default=0)
# 删除标记
isDelete = models.BooleanField(default=False)

# 多类
class HeroInfo(models.Model):
#英雄人物模型
# 英雄名
hname = models.CharField(max_length=20)
# 性别
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=200)
# 关系属性
hbook = models.ForeignKey('BookInfo')
# 删除标记
isDelete = models.BooleanField(default=False)
'''
# 注释 如果有报错 请把关系属性改为 hbook = models.ForeignKey(to='BookInfo', on_delete=models.CASCADE)

# 6、 在命令行中执行
# python manage.py makemigrations #生成迁移文件,在booktest->migrations 下方
# python manage.py migrate #根据迁移文件生成迁移表,(在mysql 数据库对应的库中可以查看)
'''
可以在把下面的语句在数据库执行
insert into booktest_bookinfo(btitle, bpub_date, bread, bcomment, isDelete)
values('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);

insert into booktest_heroinfo
(hname, hgender, hbook_id, hcomment, isDelete)
values('郭靖', 1,1,'降龙十八掌',0),
('黄蓉', 0,1,'打狗棍法', 0),
('黄药师', 1,1,'弹指神通', 0),
('欧阳锋', 1,1,'蛤蟆功', 0),
('梅超风', 0,1,'九阴白骨抓', 0),
('乔峰', 1,2,'降龙十八掌', 0),
('段誉', 1,2,'六脉神剑', 0),
('虚竹', 1,2,'天山六阳掌', 0),
('王语嫣', 0,2,'神仙姐姐', 0),
('令狐冲', 1, 3,'独孤九剑', 0),
('任盈盈', 0, 3,'弹琴', 0),
('岳不群', 1, 3,'华山剑法', 0),
('东方不败', 0, 3,'葵花宝典', 0),
('胡斐', 1, 4,'花胡家刀', 0),
('苗诺兰', 0, 4,'黄衣', 0),
('程灵素', 0, 4,'医术', 0),
('袁紫衣', 0, 4,'六合拳', 0);
'''


# 7、添加模板,在test2下添加templates 文件夹,并且在tests2中settings 中TEMPLATES中
# 修改:'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 为了方便管理在templates下再新建一个模块booktest里面放置html模板


# 8、在booktest->views 中定义一个视图
def index(request):
'''显示图书信息'''
# 1、查看所有的图书信息
books = BookInfo.objects.all()
# 2、使用模板
return render(request, 'booktest/index.html', {'books': books})


# 9、配置url
# 在test2 中添加
# url(r'^', include('booktest.url')) # 包含booktest的应用文件
# 10、在booktest中新建url.py
# from django.conf.urls import url
# from booktest import views
# urlpatterns = [
# url(r'^index$', views.index), # 包含booktest的应用文件
# ]


# 运行时报错,版本不一样,找到Django (D:pythonpython374Libdjangodbackendsmysql)中的base.py
# 修改为
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

# 继续改为operations.py中的
# if query is not None:
# query = query.encode(errors='replace')
# return query
# 如果还是报错,看看报错的位置的进行修改(我的第二次报错位置为 D:pythonpython374Libdjangodbackendsmysql)
'''
# 字段属性和选项
模型类属性命名限制:
1)不能是python 的保留关键字
2)不允许使用连续的下划线
3)定义属性时需要制定字段类型,通过字段类型的参数制定选项(属性名=models.字段类型(选项))
字段类型(使用时需要引用django.db.models)
1)AutoField: 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
2)BooleanField: 布尔字段,值为True 或False
3)NullBooleanField: 支持Null、True、False 三种值
4)CharField(max_length=最大长度):字符串,参数max_length 表示最大字符个数
5)TextFiled:大文本字符串,一般超过4000个字符使用
6)IntegerField:整数
7)DecimalField(max_digits=None,decimal_places=None):十进制浮点数(max_digits表示总位数,decimal_places表示小数位)
8)FloatField:浮点数,同上(上面更加精确)
9)DateField([auto_now=False, auto_now_add=False]):日期
auto_now:更新属性的时间
auto_now_add:自动设置创建时间
上面两个只能同时用一个
10)TimeField:时间,参数同上
11)DateTimeField:日期时间,参数同DateField
12)FileField:上传文件字段
13)ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片

选项:
1)default:默认值,设置默认值
2)primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
3)unique:若为True,这个字段在表中必须有名唯一,默认值是False
4)db_index:若为True,则在表中会为此字段创建索引,默认值是False
5)db_column:字段的名称,如果没有指定,则使用属性的名称
6)null:如果为True,表示允许为空,默认值是False
7)blank:如果为True,则该字段允许为空白,默认值是False
注释:null 是数据库范畴的概念,blank 是后台管理页面表单验证范畴的
https://docs.djangoproject.com/zh-hans/2.1/

5.查询
配置mysql,让其产生日志文件(未能实现)
1、使用下面的命令打开mysql的配置文件,去除68、69行注释,然后保存
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2、重启mysql 服务,就产生mysql 日志文件
sudo service mysql restart
3、打开MySQL 的日志文件
/var/log/mysql/mysql.log 是mysql 日志文件所在的位置

查询函数(通过模型类.objects属性)
函数名 功能 返回值 说明
get:返回表中满足条件的一条只能是一条数据 返回值是一个模型类的对象 查到多条数据会抛出异常MultipeObjectsReturned
查不到数据会抛出异常DoesNotExit
all:返回模型类中对应表格的所有数据 返回值是QuerySet 查询集
filter:返回满足条件的数据 返回值是QuerySet 参数写查询条件
exclude:返回不满足条件的数据 返回值是QuerySet 参数写查询条件
order_by:用于查询排序 返回值是QuerySet 参数中是根据那些字段进行排序
# .all().order_by('id') # 升序
# .all().order_by('-id') #降序
filter 方法:
a) 判等 条件名:exact(可以省略)
BookInfo.objects.filter(id__exact=1)
b) 模糊查询 (包含 contains、结尾 endwith、开头 startwith)
c) 空查询 isnull (字段名__isnull=False)
d) 范围查询 in (字段名__in = (1,3,5))# 元组列表都可以
e) 比较查询 gt(greate than) 大于 lt(less than) #(id__gt=3) 大于三
gte(equal) 大于等于 lte()
f) 日期查询 年 (字段名__year=1980)月month 日day

6、F对象
作用:用类属性之间的比较,
from django.db.models import F
BookInfo.objects.filter(bread__gt=F('comment') * 2)
7、Q对象
作用:用于查询时,条件之间的逻辑关系, not and or 可以对Q对象进行&|~
from django.db.models import Q
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

8、集合函数
作用:用于查询结果进行集合操作 sum count avg max min
aggregate:调用这个函数来使用聚合(返回一个字典)
from django.db.models import Sum、Count、Avg、Max、Min
# BookInfo.objects.all().aggregate(Count('id')) #返回的结果{'id__count':5}
# BookInfo.objects.count() 和上面的代码结果一样,返回一个整数

9、查询集
返回集.exists() #查看返回集有没有数据

10、模型类关系
1)一对多 models.ForeignKey() #定义在多类
2)多对多 models.ManyToManyField() #定义在哪个类中都可以
3)一对一 models.OneToOneFile()定义在哪个类中都可以

11、关联查询(一对多)
由一查多
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
例如:查询图书信息,要求图书关联的英雄的描述包含‘八’
BookInfo.object.filter(heroinfo__hcomment__contains='八')
由多查一
查看书名为'天龙八部的所有英雄'
HeroInfo.objects.filter(hbook__btitle='天龙八部')# hbook为外面的名字

通过模型类实现关联查询时,需查哪个表中的数据,就需要通过哪个类查询

写关联查询条件的时候,如果类中没有关系属性,条件需要对应类的名
如果类中有关系属性,直接写关系属性

12、插入、更新和删除
通过调用一个模型类对象的save方法的时候就可以实现对模型类对用数据表的插入和更新
通过调用一个模型类对象的delete 方法的时候就可以实现对模型类对用数据表的删除

13、自关联:一种特殊的一对多关系

14、管理类
BookInfo.objects.all()-->
objects 是Django 帮我自动生成的管理器对象,通过这个管理器对象可以实现对数据的查询

objects 是 models.Manager 类的一个对象,自己一旦定义了,Django就不在提供了

15、元选项
在定义表中添加
class Meta:
db_table = 'bookinfo'
作用:生成自己想要对用的表名

=======视图=============
1、视图的功能
接受请求,进行处理,与M和 T进行交互,返回应答
返回html 内容HttpResponse,也可能重定向redirect
2、视图函数使用
2.1 使用
1)定义视图函数
request 参数必须有,是一个HttpRequest 类对象,可以改但是不要改
2)配置url
建立url 和视图函数之间的对应关系
2.2 url配置过程
1)在项目的urls 文件中添加具体的urls文件,再具体应用的urls文件中包含具体的url和视图的对应关系
2)url 配置项是定义在一个名叫urlpatterns 的列表中,其中每一个元素就是一个配置项,每一个配置项都调用url函数
3、匹配过程
4、错误视图
404:找不到页面,默认会显示一个错误的标准页面,如果要自定义页面,在templates 目录下自定义一个404.html
a)url 没有配置
b)url 配置错误
500:视图出错
网站开发完成需要关闭调试模式,在settings.py 文件中:
DEBUG = False
ALLOWED_HOSTS = [*]
5、捕获url 参数
进行url 匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样
Django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数
1)位置参数 # url(r'^showarg(d+)$', views.show_arg)
参数名可以随意制定
2)关键字参数 # url(r'^showarg(?P<num>d+)$', views.show_arg)
参数名必须和正则表达式中的一样
6、普通登入案例
request 是HttpRequest 类型的对象
request 包含浏览器请求的信息

在请求的html 中
<form method="post" action="login_check">
用户名:<input type="text" name="username" /> <br/>
密码:<input type="password" name = 'password' /><br />
<input type="submit" value="登入" />
</form>

给出接受的login_check视图
def login_check(request):
#登入校验视图
# request.POST 保存的是post方式提交的参数
# request.GET 保存的是get方式提交的参数
# 1、 获取提交的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
print(username)
print(password)
# 2、 进行登入校验
if username == 'smart' and password == '123':
# 用户名密码正确
return redirect('/index')
else:
return redirect('/login')

并且配置url


7、ajax
新建static 文件,并且再新建js、css、images文件

ajax:异步的javascript
在不加载页面的情况下,对页面进行局部刷新
$.ajax({
'url':请求地址,
'type':请求方式,
'dataType':预期返回的数据格式,
'data':参数,
'async':false, //同步的设置,按照代码的顺序执行,默认异步不会等待服务器的返回结果继续执行代码
}).success(function(data){
//回调函数
})

示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ajax</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
// 绑定 btnAjax的click 事件
$('#btnAjax').click(function () {
$.ajax({
'url':'/ajax_handle',
'dataType': 'json'
}).success(function (data) {
//进行处理
// alert(data.res)
if (data.res == 1){
$('#message').show().html('提示信息')
}
})

})
})
</script>
<style>
#message{
display: none;
color: red;
}
</style>
</head>
<body>
<input type="button" id="btnAjax" value="ajax请求">
<div id="message"></div>
</body>
</html>

定义ajax_handle视图,并且配置url
示例如下:
def ajax_handle(request):
# 返回ajax处理
# 返回json 数据
return JsonResponse({'res':1})

8、cookie 和 session

1)以键值对的格式写session
request.session['键'] = 值
2)根据键读取值
request.session.get('键', 默认值)
3)清楚所有session,在储存中删除值部分
request.session.clear()
4)清除session 数据,在储存中删除session的整条数据
request.session.flush()
5)删除session中的指定键及值,在储存中只删除摸个键及对应的值
del request.session['键']
6) 设置会话的超时时间,如果没有指定过期时间则两个星期后过期
request.session.set_expiry(value)

8.3 cookie和session的应用场景
cookie:记住用户名。安全性要求不高。
session:涉及到安全性要求比较高的数据。银行卡账户,密码

'''
'''
模板文件的使用
1、新建Django
1.1 使用pycharm--> File --> New Project --> Django -->选择:Location 和Application name 填写
1.2 设置数据库 和 __init__.py

2、在 template 中新建booktest 文件,在其中添加index.html
3、定义视图、配置url
'''


原文地址:https://www.cnblogs.com/fuyouqiang/p/11844583.html