本文内容是个人笔记,摘自《千锋python教程:Django基础到实战讲解(精华版)》视频。
千锋教育的老师使用的是:Python版本3.6x;Django版本1.1.4;
我使用的是:Python版本3.6.4;Django版本2.1b1;硬件环境:win10电脑;软件环境:PyCharm;
进入某目录下创建项目(自动创建文件夹):
D:\qfdjango\01-sunck>django-admin startproject project
查看目录树状层级:
D:\qfdjango\01-sunck>tree . /F
配置数据库:配置mysql数据库时,需要在__init__.py文件中写入2句代码。
在settings文件中配置数据库时,mysql里没有数据库,需要在数据库里建一个数据库。
Settings文件里需要配置的关于数据库的内容示例:
启动mysql数据库:
C:\WINDOWS\system32>net start mysql57
登陆服务器:
C:\WINDOWS\system32>mysql -u root -p
选中数据库:use 库名
删除数据库:drop database 库名
创建数据库:create database 库名
项目根目录下,创建app:D:\qfdjango\01-sunck\project>python manage.py startapp myApp
App目录说明:admin站点配置;models模型;views视图;
创建完app需要在settings文件里配置一下:
要与数据库里的进行交互,需要先建立模型,和映射模型:models.py
其中”关联外键”那里,on_delete根据自己的需求添加(因为django版本不同,报错了,自己百度后添加的参数)。
【也可以在项目目录下(不是app目录)命令python manage.py makemigrations来生成迁移文件:D:\qfdjango\01-sunck\project>python manage.py makemigrations;
命令python manage.py migrate来执行迁移文件:D:\qfdjango\01-sunck\project>python manage.py migrate;】
在映射/生成数据库表时,如果想修改表结构,最好把迁移文件和数据库生成的表都删除,重新生成数据库表。myApp/migrations目录下是迁移文件。
查看数据库中的表:use 库名;show tables;展示表。
展示表结构:desc myapp_student;
测试数据操作:
进入django的python shell用 命令python manage.py shell来进入。
引入包(需要什么类型数据导入什么包,如datetime):
from appname.models import tablename,tablename # tablename是models中的类名
from django.utils import timezone
from datetime import *
查询所有数据:class/tablename.objects.all() # 只能查看有没有数据,不能查看有什么数据,如果想查看有什么数据,需要修改models中需要查看的类(在下面添加代码 # 注意安全性待考证)
查看单条数据:taxon/tablename.objects.get(pk=num) # num是哪一条数据。
添加单条数据:
变量name = 类名() # 类名是需要实例化的models中的类名
变量name.modelVariablename = 需要添加的数据
变量name.save() # 保存到数据库
可以把图片中的代码写在一个文件中去执行。
修改数据和添加数据差不多,类似python中修改变量的值,用save()提交到数据库。
模型对象.属性 = 新值
删除某条数据:变量name.delete() # 物理删除,数据库里的数据会被删除。
出现第二行格式的内容说明删除成功。
让两个表中的数据关联:变量name.关联的主键 = 对象名
变量name = 对象名.students_set.create(**kargs) # 一次性添加关联数据,不用save()。
查看数据库中某张表的所有数据:
添加了一条数据之后再去django-shell中查看:
Models中更改执行Grades.objects.all()时的展示格式:
更改后的显示格式:(更改后需要先重进shell)
在学生表中添加数据,使其与班级表关联:
查看某一班级的所有学生:
启动django服务器:命令格式:python manage.py runserver ip port
ip可以不写,不写代表本机ip
端口号默认8000,可以修改,在启动服务器时填写其他port就是修改;
# 这是一个轻量级服务器,项目上线时会使用其他服务器,而不是django自带的。
启动成功后网站显示:
admin站点管理:(为了方便管理数据)
添加admin应用:在settings文件中INSTALLED_APPS下添加'django.contrib.admin'。默认django已经给添加好了。
cd到项目目录下执行python manage.py createsuperuser创建超级管理员,依次输入登录名、邮箱、密码。
浏览器端输入http://127.0.0.1:8000/admin/进入管理员登陆界面,用自己创建超级管理员时的登陆名和密码登陆。
汉化admin后台:修改 settings.py下的LANGUAGE_CODE = 'zh-hans' # 汉语
TIME_ZONE = 'Azia/Shanghai' # 上海时间
管理数据表:
修改admin.py文件:
导入两个表:from .models import Grades,Students # .models 当前目录下 的models
注册:admin.site.register(models里的类名)
修改admin.py文件之前网站后台的显示:
修改admin.py中的内容,使数据可以在admin后台进行管理:
自定义管理界面的admin.site.register(models里的类名,类名) # 自定义管理界面的类需要继承admin.ModelAdmin。
自定义管理界面:
属性说明:
列表也属性:
list_display:[需要显示的字段,] # 列表形式
list_filter:[过滤字段,]
search_fields:[搜索字段,] # 可以按什么字段查找
list_per_page:num # 分页,每num条是一页显示。
添加、修改页属性:
fields:[,] # 修改属性的先后顺序
未修改添加页面时,页面的样子:
需要修改的代码:
修改之后django会依照admin文件中的代码自动将修改页改变,按列表给出的顺序进行排列。
fieldsets: # 给属性分组
fieldsets = [ # 例子
('num',{'fields':['ggirlnum','gboynum']}),
('base',{'fields':['gname','gdate','isDelete']}),
]
修改‘增加grades’添加页面默认展现方式之后的样子:
# fields与fieldsets不能同时使用
自定义添加学生页面:
使其在创建班级时,可以同时添加两个学生,admin中需要修改的代码:
admin.StackedInline与admin.TabularInline的显示方式会不一样,前者竖排显示,后者横排显示。
将性别的展示方式,从true和false改为男和女:
自定义字段/列的名称:
修改完之后页面的显示效果:
修改执行动作的位置:
修改玩执行动作后,页面的变化:
以装饰器的方式进行注册:
自定义视图/视图的基本使用:
修改project文件下的urls文件,让它做一个转接任务:
在myApp文件下创建urls.py文件,并在里面加入代码,它做的是返回视图操作:
url中正则匹配的时从端口号之后开始匹配,端口号之前不会匹配。
正则表达式r’^$’
^从某字符开始,$到某字符结束,因为^和$之间没有字符,所以匹配的是127.0.0.1:8000
正则表达式 r’^(\d+)/(\d+)$’
(\d+)一组数字,()括号里匹配到的字符为一组。
这个匹配到的网址是127.0.0.1:8000/数字/数字(其中数字是任意长的数字串)
显示结果:
模板的基本使用:
在项目根目录的project文件夹下创建一个templates文件用来存放模板。
在settings.py文件中添加圈中的代码:
BASE_DIR是项目的根目录,将两个join在一起,就拼接成了模板目录;
模板语法:
{{ 输出值,可以是变量,可以是对象.属性 }}
{% 执行代码或代码段 %}
在myApp下建立一个html文件,写下下面的代码。
这个html文件就是一个模板。
在项目app的urls文件中添加代码来做模板的url分发:
在app目录下的views.py文件中添加下面的代码,用来向模板里返回数据。
①写页面模板;②写视图;③配置url分发;
一个url匹配一个视图。
在myApp目录下创建一个学生模板(HTML文件):
urls.py链接分发器下返回学生模板url:
学生模板在视图中的函数:(前端页面根据返回的字典参数的名字来区分返回的数据。)
在班级页面点击班级时,显示班级中学生的信息:
views.py文件中需要修改:
urls.py文件中需要修改:
=============================================================================
在映射/生成数据库表时,如果要修改表结构,最好把迁移文件和数据库生成的表都删除,重新生成数据库表。myApp/migrations目录下是迁移文件。
流程:
→创建工程
→创建项目app
→激活项目(setting文件中设置)
→配置数据库(__init__.py和setting文件)
→创建模型类(一个模型类都在数据库中对应一张数据库表。)
→生成迁移文件
→执行迁移文件
→配置站点
→创建模板目录/项目模板目录
→配置模板路径(setting文件中)
→修改project下的urls文件
→在项目app目录下创建urls.py文件。
使用模型类进行增删改查(crud)操作。
在之后的Django项目中,可以通过修改几项来使用根据基本流程所写的Django项目雏形。
1.在setting.py里修改原先的数据库名,为以后要使用的数据库名
2.在setting.py里修改原先的数据库密码为以后自己要使用的数据库密码
3.删除迁移文件
4.在数据库创建对应第一步(以后要使用的)的数据库
5.执行命令生成迁移文件,执行迁移文件
6.启动服务,浏览器测试
Django模型部分简单示例:
Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用api,可以根据不同的业务需求选择不同的数据库。
配置数据库:
修改工程目录下的__init__.py文件:
修改setting.py文件:
使用模型类进行增删改查(crud)操作。
ORM:
概述:对象·关系·映射
任务:根据对象的类型生成表结果(迁移的时候)。
将对象、列表的操作转换为sql语句。
将sql语句查询到的结果转换为对像、列表。
优点:极大的减轻了开发人员的工作量,不需要因数据库的变更而修改代码(如果需要修改代码,需要修改的部分也会很少)。
模型、属性、表、字段间的关系:一个模型类在数据库中对应一张表,在模型类中定义的属性对应该模型对照表中的一个字段。
定义属性:
概述:
Django根据属性的类型确定以下信息:
①当前选择的数据库支持字段的类型
②渲染管理表单时使用的默认html控件
③在管理站点最低限度的验证
Django会为表增加自动增长的主键列,每个模型只有一个主键列,如果使用选项 设置某属性为主键列后,则Django不会再生成默认的主键列。
属性命名限制:
①不能时python的保留关键字(遵循标识符规则)
②由于django的查询方式,不能使用连续的下划线
库:
定义属性时,需要字段类型被定义在django.db.models.fields目录下,为了方便使 用,被导入到django.db.models中。
使用方式:
①导入from django.db import models
②通过models.Field创建字段类型的对象,赋值给属性
逻辑删除:
对于重要数据都做逻辑删除,不能物理删除,实现方式是定义isDelete属性,类型 为BooleanField,默认值为False。
字段类型:
AutoField:
一个根据实际ID自动增长的IntegeField,通常不指定
如果不指定,一个关键字段将自动添加到模型中
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实例来表示的浮点数。
BooleanField:True/false字段,此字段的默认表单控件是CheckboxInput。
NullBooleanField:支持null、true、false三种值。
DateField([auto_now=False,auto_now_add=False]):
使用Python的datetime.date实例表示的日期。
参数说明:
auto_now:每次保存对象时,自动设置该字段为当前时间,用于”最后一次修改” 的时间戳,他总是使用当前日期,默认为false。
auto_now_add:当对象第一次被创建时自动设置为当前时间,用于创建时的时间戳,它总是使用当前日期,默认为false。
说明:该字段默认对应表单控件是一个TextInput,在管理员站点添加了一个 JavaScript写的日历控件,和一个”Today”的快捷按钮,包含了一个额外的 invalid_date错误消息键。
注意:auto_now_add,auto_now,and default这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果。
TimeField:使用python的datatime.time实例表示时间,参数同DtaeField。
DateTimeField:使用python的datetime.datetime实例表示时间和日期,参数同DateField。
FiledField:一个上传文件的字段。
ImageField:继承了FileField的所有属性和方法,但对上传对象进行校验,确保它是个有效 的image。
字段选项/字段参数:
概述:
通过字段选项,可以实现对字段的约束。
在字段对象时通过关键字参数指定。
null:如果为True,Django将空值以null存储到数据库中,默认值时False。
blanke:如果为True,则该字段允许为空白,默认值是False。
注意:null是数据库范畴的概念,blank是表单验证范畴的。
db_column:字段的名称,如果未指定,则使用属性的名称。
db_index:若值为True,则在表中会为此字段创建索引。
default:默认值。
primary_key:是否是主键。若为True,则该字段会成为模型的主键字段。
unique:如果为True,这个字段在表中必须有唯一值。唯一约束/唯一值。
关系:
分类:
ForeignKey:一对多,将字段定义在多的端中。
ManyToManyField:多对多,将字段定义在两端中。
OneToOneField:一对一,将字段定义在任意一端中。
用一访问多:
格式:对象.模型类小写_set
示例:grade.students_set
用一访问一:
格式:对象.模型类小写
示例:grade.students
访问id:
格式:对象.属性_id
示例:students.sgrade_id
定义模型类:
元选项:在模型类中定义Meta类,用于设置信息。
db_table:定义数据表名,推荐使用小写字母,如果不写,数据表名默认为项目名小写 _类名小写。
ordering:对象的默认排序字段,获取对象的列表时使用。排序会增加数据库的开销。
模型成员:
类属性:类里面的变量就是类属性。
object:是Manager类型的一个对象,作用是与数据库进行交互。(隐藏属性)
定义模型类时,没有指定管理器,则为Django为模型创建一个名为object 的管理器。
自定义管理器stuObj会取代默认管理器object。
【本文是个人笔记,仅供参考,不推荐在实际工作中应用。如果像系统学习Django,推荐你在自强学堂-Django教程学习】