python datetime需要安装_Python全栈工程师学习笔记 | Django的模型层
Model模型
模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。
通常,每个模型对应数据库中唯一的一张表。
每个模型都是django.db.models.Model的一个Python 子类。
模型的每个属性都表示为数据库中的一个字段。
Django 提供一套自动生成的用于数据库访问的API;
这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳
模型与数据库的关系
模型(Model)负责业务对象和数据库的关系映射(ORM)
ORM是“对象-关系-映射”的简称,主要任务是:
根据对象的类型生成表结构
将对象、列表的操作,转换为sql语句
将sql查询到的结果转换为对象、列表
为什么要用模型?
Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据
它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库
配置Mysql数据库
1.在当前环境中安装mysql
1sudo apt-get install mysql-server2sudo apt install mysql-client3sudo apt install libmysqlclient-dev
2.在当前python环境中安装 pymysql
1pip3 install pymysql
3.在mysql中创建数据库
1create databases mytest default charset=utf8
4.在Django项目中配置数据库
修改settings.py文件中的DATABASE配置项
1DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'mytest',#选择数据库的名,请确认你的mysql中有这个库 5 'USER': 'root', 6 'PASSWORD': '', 7 'HOST': 'localhost', 8 'PORT': '3306', 9 }10}
5.告诉Django在接下来的mysql操作中使用pymysql
打开 myweb/__init__.py,写入以下代码导入pymysql:
1import pymysql2pymysql.install_as_MySQLdb()
开发流程
1.在models.py中定义模型类,要求继承自models.Model
1from django.db import models 2from datetime import datetime 3 4# Create your models here. 5class Users(models.Model): 6 name = models.CharField(max_length=32) 7 age = models.IntegerField(default=20) 8 phone = models.CharField(max_length=16) 9 addtime=models.DateTimeField(default=datetime.now)1011 #class Meta:12 # db_table = "myapp_users" # 指定表名
2.把应用加入settings.py文件的installed_app项
编辑myweb/settings.py文件,并将项目应用文件名添加到该INSTALLED_APPS设置。
1INSTALLED_APPS = [2 'django.contrib.admin',3 'django.contrib.auth',4 'django.contrib.contenttypes',5 'django.contrib.sessions',6 'django.contrib.messages',7 'django.contrib.staticfiles',8 'myapp',9]
3.生成迁移文件
1python3 manage.py makemigrations 2 3django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No mo 4dule named 'MySQLdb'. 5Did you install mysqlclient or MySQL-python? 6安装上面"配置Mysql数据库"的第五步配置,或安装:pip install mysqlclient后就可以了 7 8若执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下: 910 先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py11 再 python manage.py makemigrations 生成原先的model对应的migration file
4.执行迁移
1python3 manage.py migrate
5.使用模型类进行crud操作(具体详见第二小节)
定义模型
在模型中定义属性,会生成表中的字段
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自动增长的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, 这个字段在表中必须有唯一值
▌关系
关系的类型包括
ForeignKey:一对多,将字段定义在多的端中
ManyToManyField:多对多,将字段定义在两端中
OneToOneField:一对一,将字段定义在任意一端中
可以维护递归的关联关系,使用'self'指定,详见“自关联”
用一访问多:对象.模型类小写_set
1bookinfo.heroinfo_set
用一访问一:对象.模型类小写
1heroinfo.bookinfo
访问id:对象.属性_id
1heroinfo.book_id
元选项
在模型类中定义类Meta,用于设置元信息
元信息db_table:定义数据表名称,推荐使用小写字母,
数据表的默认名称:_
例如myweb_users
ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
1class BookInfo(models.Model):2 ...3 class Meta():4 ordering = ['id']
字符串前加-表示倒序,不加-表示正序
1class BookInfo(models.Model):2 ...3 class Meta():4 ordering = ['-id']
排序会增加数据库的开销
示例演示
创建test2项目,并创建booktest应用,使用mysql数据库
定义图书模型
1class BookInfo(models.Model):2 btitle = models.CharField(max_length=20)3 bpub_date = models.DateTimeField()4 bread = models.IntegerField(default=0)5 bcommet = models.IntegerField(default=0)6 isDelete = models.BooleanField(default=False)
英雄模型
1class HeroInfo(models.Model):2 hname = models.CharField(max_length=20)3 hgender = models.BooleanField(default=True)4 isDelete = models.BooleanField(default=False)5 hcontent = models.CharField(max_length=100)6 hbook = models.ForeignKey('BookInfo')
定义index、detail视图
index.html、detail.html模板
配置url,能够完成图书及英雄的展示
测试数据
模型BookInfo的测试数据
1insert into booktest_bookinfo(btitle,bpub_date,bread,bcommet,isDelete) values2('射雕英雄传','1980-5-1',12,34,0),3('天龙八部','1986-7-24',36,40,0),4('笑傲江湖','1995-12-24',20,80,0),5('雪山飞狐','1987-11-11',58,24,0)
模型HeroInfo的测试数据
1insert into booktest_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values 2('郭靖',1,1,'降龙十八掌',0), 3('黄蓉',0,1,'打狗棍法',0), 4('黄药师',1,1,'弹指神通',0), 5('欧阳锋',1,1,'蛤蟆功',0), 6('梅超风',0,1,'九阴白骨爪',0), 7('乔峰',1,2,'降龙十八掌',0), 8('段誉',1,2,'六脉神剑',0), 9('虚竹',1,2,'天山六阳掌',0),10('王语嫣',0,2,'神仙姐姐',0),11('令狐冲',1,3,'独孤九剑',0),12('任盈盈',0,3,'弹琴',0),13('岳不群',1,3,'华山剑法',0),14('东方不败',0,3,'葵花宝典',0),15('胡斐',1,4,'胡家刀法',0),16('苗若兰',0,4,'黄衣',0),17('程灵素',0,4,'医术',0),18('袁紫衣',0,4,'六合拳',0)
模型实例
1.类的属性
objects:是Manager类型的对象,用于与数据库进行交互
当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器
支持明确指定模型类的管理器
1class BookInfo(models.Model):2 ...3 books = models.Manager()
当为模型类指定管理器后,django不再为模型类生成名为objects的默认管理器
2. 创建对象
当创建对象时,django不会对数据库进行读写操作
调用save()方法才与数据库交互,将对象保存到数据库中
使用关键字参数构造模型对象很麻烦,推荐使用下面的两种之式
说明:init方法已经在基类models.Model中使用,在自定义模型中无法使用
3. 实例的属性
DoesNotExist:在进行单个查询时,模型的对象不存在时会引发此异常,结合try/except使用
4. 实例的方法
__str__(self):重写object方法,此方法在将对象转换成字符串时会被调用
save():将模型对象保存到数据表中
delete():将模型对象从数据表中删除
模型查询
查询集表示从数据库中获取的对象集合
查询集可以含有零个、一个或多个过滤器
过滤器基于所给的参数限制查询的结果
从Sql的角度,查询集和select语句等价,过滤器像where和limit子句
接下来主要讨论如下知识点
查询集
字段查询:比较运算符,F对象,Q对象
1. 查询集
在管理器上调用过滤器方法会返回查询集
查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库
何时对查询集求值:迭代,序列化,与if合用
返回查询集的方法,称为过滤器
all()
filter()
exclude()
order_by()
values():一个对象构成一个字典,然后构成一个列表返回
写法:
1filter(键1=值1,键2=值2)2等价于3filter(键1=值1).filter(键2=值2)
返回单个值的方法
get():返回单个满足条件的对象
如果未找到会引发"模型类.DoesNotExist"异常
如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
count():返回当前查询的总条数
first():返回第一个对象
last():返回最后一个对象
exists():判断查询集中是否有数据,如果有则返回True
限制查询集
查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句
注意:不支持负数索引
使用下标后返回一个新的查询集,不会立即执行查询
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常
1#这会返回前5个对象 LIMIT 52Entry.objects.all()[:5]3#这将返回第六个到第十个对象 OFFSET 5 LIMIT 54Entry.objects.all()[5:10]
查询集的缓存
每个查询集都包含一个缓存来最小化对数据库的访问
在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存的结果
情况一:这构成了两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载
1print([e.title for e in Entry.objects.all()])2print([e.title for e in Entry.objects.all()])
情况二:两次循环使用同一个查询集,第二次使用缓存中的数据
1querylist=Entry.objects.all()2print([e.title for e in querylist])3print([e.title for e in querylist])
何时查询集不会被缓存:当只对查询集的部分进行求值时会检查缓存,但是如果这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,如果这部分数据已经被缓存,则直接使用缓存中的数据
2. 字段查询
实现where子名,作为方法filter()、exclude()、get()的参数
语法:属性名称__比较运算符=值
表示两个下划线,左侧是属性名称,右侧是比较类型
对于外键,使用“属性名_id”表示外键的原始值
转义:like语句中使用了%与,匹配数据中的%与,在过滤器中直接写,例如:filter(title__contains="%")=>where title like '%\%%',表示查找标题中包含%的
比较运算符
exact:表示判等,大小写敏感;如果没有写“ 比较运算符”,表示判等
1filter(isDelete=False)
contains:是否包含,大小写敏感
1exclude(btitle__contains='传')
startswith、endswith:以value开头或结尾,大小写敏感
1exclude(btitle__endswith='传')
isnull、isnotnull:是否为null
1filter(btitle__isnull=False)
在前面加个i表示不区分大小写,如iexact、icontains、istarswith、iendswith
in:是否包含在范围内
1filter(pk__in=[1, 2, 3, 4, 5])
gt、gte、lt、lte:大于、大于等于、小于、小于等于
1filter(id__gt=3)
year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算
1filter(bpub_date__year=
跨关联关系的查询:处理join查询
语法:模型类名
注:可以没有__部分,表示等于,结果同inner join
可返向使用,即在关联的两个模型中都可以使用
1filter(heroinfo_ _hcontent_ _contains=
聚合函数
使用aggregate()函数返回聚合函数的值
函数:Avg,Count,Max,Min,Sum
1
count的一般用法:
1count = list.count()
Model模型的实战操作笔记
1. 创建数据库和表(若是执行表迁移,可跳过下面操作)
进入MySQL数据库创建数据库:mytest
进入数据库创建数据表:myapp_users
1CREATE TABLE `myapp_users` ( 2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(32) NOT NULL, 4 `age` tinyint(3) unsigned NOT NULL DEFAULT '20', 5 `phone` varchar(16) DEFAULT NULL,6 `addtime` datetime(6) NOT NULL, 7 PRIMARY KEY (`id`) 8) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
添加几条测试数据
2. 创建项目myweb和应用myapp
1# 创建项目框架myweb 2 $ django-admin startproject myweb 3 4 $ cd myweb 5 6 # 在项目中创建一个myapp应用 7 $ python3.6 manage.py startapp myapp 8 9 # 创建模板目录10 $ mkdir templates11 $ mkdir templates/myapp1213 $ cd ..1415 $ tree myweb1617 myweb18 ├── myweb19 │ ├── __init__.py20 │ ├── settings.py21 │ ├── urls.py22 │ └── wsgi.py23 ├── manage.py24 ├── myapp25 │ ├── admin.py26 │ ├── apps.py27 │ ├── __init__.py28 │ ├── models.py29 │ ├── tests.py30 │ └── views.py31 └── templates32 └── myapp
3.执行数据库连接配置,网站配置
3.1 编辑myweb/myweb/__init__.py文件,添加Pymysql的数据库操作支持
1import pymysql2pymysql.install_as_MySQLdb()
3.2 编辑myweb/myweb/settings.py文件,配置数据库连接
1... 2#配置自己的服务器IP地址 3ALLOWED_HOSTS = ['localhost','127.0.0.1','172.16.142.129'] 4 5... 6#添加自己应用 7INSTALLED_APPS = [ 8 'django.contrib.admin', 9 'django.contrib.auth',10 'django.contrib.contenttypes',11 'django.contrib.sessions',12 'django.contrib.messages',13 'django.contrib.staticfiles',14 'myapp',15]16...1718# 配置模板路径信息19TEMPLATES = [20 {21 'BACKEND': 'django.template.backends.django.DjangoTemplates',22 'DIRS': [os.path.join(BASE_DIR,'templates')],23 'APP_DIRS': True,24 'OPTIONS': {25 'context_processors': [26 'django.template.context_processors.debug',27 'django.template.context_processors.request',28 'django.contrib.auth.context_processors.auth',29 'django.contrib.messages.context_processors.messages',30 ],31 },32 },33]343536...37# 数据库连接配置38DATABASES = {39'default': {40 'ENGINE': 'django.db.backends.mysql',41 'NAME': 'mytest',42 'USER': 'root',43 'PASSWORD': '',44 'HOST': 'localhost',45 'PORT': '3306',46}47...
4. 定义Model类
4.1 编辑myweb/myapp/models.py
1from django.db import models 2 3 4class Users(models.Model): 5 name = models.CharField(max_length=32) 6 age = models.IntegerField(default=20) 7 phone = models.CharField(max_length=16) 8 addtime=models.DateTimeField(default=datetime.now) 910 def __str__(self):11 return self.name+":"+self.phone
4.2 测试Model类的使用
在项目根目录下执行命令: python3 manage.py shell
1[root@localhost myweb]# ls 2myweb manage.py myapp 3 4[root@localhost myweb]# python3 manage.py shell 5Python 3.6.1 (default, Jul 18 2017, 01:35:19) 6[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux 7Type "help", "copyright", "credits" or "license" for more information. 8(InteractiveConsole) 910>>> from myapp.models import Users1112>>> Users.objects.all()1312345678901>, 13456789023>]>1415>>> s = Users.objects.get(id=1)1617>>> s.id1811920>>> s.name21'张三'2223>>> s.age24202526>>> s.phone27'12345678901'2829>>>
5.实现 Web 端访问
5.1 编辑myweb/myweb/settings.py文件.做 ALLOWED_HOSTS 主机访问配置(若第三步已做可跳过此步骤)
1 #此处添加自己的IP地址2 ALLOWED_HOSTS = ['localhost','127.0.0.1','172.16.142.129']
5.2 编写项目主路由urls配置,配置对myapp应用路由的访问连接配置
1from django.conf.urls import include,url2from django.contrib import admin34urlpatterns = [5 url(r'^admin/', admin.site.urls),6 url(r'^', include('myapp.urls')),7]
5.3 配置当前应用myapp的路由配置
在myapp应用目录下创建一个路由文件urls.py文件,注意此文件编码为utf-8(建议复制一个)。
编辑应用中的路由配置文件:myweb/myapp/urls.py, 内容如下:
1from django.conf.urls import url23from . import views45urlpatterns = [6 url(r'^$', views.index, name="index"),7]
5.4 编辑视图文件:myweb/myapp/views.py,内容如下
1
5.5 测试
项目根目录下运行 python3 manage.py sunserver 0:8000 命令,开启服务:
1[root@localhost myweb]# python3.6 manage.py runserver 0:80002Performing system checks...34System check identified no issues (0 silenced).56July 28, 2017 - 14:01:527Django version 1.11, using settings 'myweb.settings'8Starting development server at http://0:8000/9Quit the server with CONTROL-C.
打开浏览器,在浏览其中输入网址测试:http://172.16.142.129:8000
显示结果:张三:12345678901
继续上面操作完成Web版的Users信息增 删 改 查
1. 准备模板文件,创建模板目录
在项目目录下创建templates模板目录
进入模板目录templates,在模板目录下创建应用名myapp的目录
进入myapp目录,在里面创建一个users目录
进入users目录,在里面创建文件:
index.html,add.html,edit.html,menu.html,info.html
设置模板目录信息:编辑myweb/myweb/settings.py文件(若第三步已做可跳过此步骤)
1...2 'BACKEND': 'django.template.backends.django.DjangoTemplates',3 'DIRS': [os.path.join(BASE_DIR,'templates'),],4 'APP_DIRS': True,5...
2. 配置路由信息
打开文件:myweb/myapp/urls.py路由文件,加入六条路由配置信息
1from django.conf.urls import url 2 3from . import views 4 5urlpatterns = [ 6 url(r'^$', views.index, name="index"), 7 url(r'^users$', views.indexUsers, name="users"), #浏览用户信息 8 url(r'^users/add$', views.addUsers, name="addusers"), #加载添加用户信息表单 9 url(r'^users/insert$', views.insertUsers, name="insertusers"), #执行用户信息添加10 url(r'^users/(?P[0-9]+)/del$', views.delUsers, name="delusers"), #执行用户信息删除11 url(r'^users/(?P[0-9]+)/edit$', views.editUsers, name="editusers"), #加载用户信息编辑表单12 url(r'^users/update$', views.updateUsers, name="updateusers"), #执行用户信息编辑13]
3. 编写视图文件:myweb/myapp/views.py
1# 注意:需导入from django.shortcuts import render 2 3from django.shortcuts import render 4from django.http import HttpResponse 5 6from myapp.models import Users 7 8def index(request): 9 try:10 list = Users.objects.filter(id__in=[1,3,5])11 s = ','.join([vo.name for vo in list])1213 #修改(将id值为5的age值改为30)14 #ob = Users.objects.get(id=5)15 #ob.age = 3016 #ob.save()1718 #删除(删除id为3的信息) 19 #ob = Users.objects.get(id=3)20 #ob.delete()2122 return HttpResponse(s)23 except:24 return HttpResponse("没有找到对应的信息!")2526# 浏览用户信息 27def indexUsers(request):28 # 执行数据查询,并放置到模板中29 list = Users.objects.all()30 context = {"stulist":list}31 return render(request,"myapp/users/index.html",context)3233# 加载添加信息表单34def addUsers(request): 35 return render(request,"myapp/users/add.html")3637# 执行信息添加操作38def insertUsers(request): 39 try:40 ob = Users()41 ob.name = request.POST['name']42 ob.age = request.POST['age']43 ob.phone = request.POST['phone']44 ob.save()45 context = {'info':'添加成功!'}46 except:47 context = {'info':'添加失败!'}48 return render(request,"myapp/users/info.html",context)4950# 执行信息删除操作 51def delUsers(request,uid): 52 try:53 ob = Users.objects.get(id=uid)54 ob.delete()55 context = {'info':'删除成功!'}56 except:57 context = {'info':'删除失败!'}58 return render(request,"myapp/users/info.html",context)5960# 加载信息编辑表单 61def editUsers(request,uid): 62 try:63 ob = Users.objects.get(id=uid)64 context = {'user':ob}65 return render(request,"myapp/users/edit.html",context)66 except:67 context = {'info':'没有找到要修改的信息!'}68 return render(request,"myapp/users/info.html",context)6970# 执行信息编辑操作71def updateUsers(request):72 try:73 ob = Users.objects.get(id= request.POST['id'])74 ob.name = request.POST['name']75 ob.age = request.POST['age']76 ob.phone = request.POST['phone']77 #ob.addtime = datetime.now78 ob.save()79 context = {'info':'修改成功!'}80 except:81 context = {'info':'修改失败!'}82 return render(request,"myapp/users/info.html",context)
4. 编辑浏览信息视图文件,
文件位置:
myweb/templates/myapp/users/index.html
1html> 2 3
4 "utf-8"/> 5 用户信息管理 6 16 17 18
1920 {% include 'myapp/users/menu.html' %}2122
浏览用户信息
23
"800" border="1">24 25 id号26 姓名27 年龄28 电话29 添加时间30 操作31 32 {% for stu in stulist %}33 34 {{ stu.id }}35 {{ stu.name }}36 {{ stu.age }}37 {{ stu.phone }}38 {{ stu.addtime|date:'Y-m-d H:i:s' }}39 40 "{% url 'editusers' stu.id %}">编辑41 "javascript:doDel('{% url 'delusers' stu.id %}');">删除42 43 44 {% endfor %}45 46
47 48
5. 编辑添加表单视图文件
文件位置:
myweb/templates/myapp/users/add.html
1html> 2 3
4 "utf-8"/> 5 用户信息管理 6 7 8
9 {% include "myapp/users/menu.html" %}1011
添加用户信息
12 "{% url 'insertusers' %}" method="post">13 {% csrf_token %}14
"280" border="0">15 16 姓名:17 "text" name="name"/>18 19 20 年龄:21 "text" name="age"/>22 23 24 电话:25 "text" name="phone"/>26 27 28 "2" align="center">29 "submit" value="添加"/>30 "reset" value="重置"/>31 32 33 34 35
36 37
6. 编辑信息表单视图文件
文件位置:
myweb/templates/myapp/users/edit.html
1html> 2 3
4 "utf-8"/> 5 用户信息管理 6 7 8
9 {% include "myapp/users/menu.html" %}10
修改用户信息
11 "{% url 'updateusers' %}" method="post">12 "hidden" name="id" value="{{ user.id}}"/>13 {% csrf_token %}14
"280" border="0">15 16 姓名:17 "text" name="name" value="{{ user.name }}"/>18 19 20 年龄:21 "text" name="age" value="{{ user.age }}"/>22 23 24 电话:25 "text" name="phone" value="{{ user.phone }}"/>26 27 28 "2" align="center">29 "submit" value="编辑"/>30 "reset" value="重置"/>31 32 33 34 35
36 37
7. 编辑公共导航栏页视图文件
文件位置:
myweb/templates/myapp/users/menu.html
1
用户信息管理
2 "{% url 'users' %}">浏览用户 |3 "{% url 'addusers' %}">添加用户4
文件位置:
myweb/templates/myapp/users/info.html
1html>
想要了解更多资讯,请扫描下方二维码,关注机器学习研究会
转自:Python大本营
python datetime需要安装_Python全栈工程师学习笔记 | Django的模型层相关推荐
- Python全栈工程师学习笔记 | Django的模型层
Model模型 模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 每个模型都是django.db.models.Model的一个Py ...
- 唤醒手腕Python全栈工程师学习笔记(网络爬虫篇)
唤醒手腕Python爬虫学习笔记,喜欢的同学们可以收藏下,谢谢支持. 01.基础语法知识点 字符串的分割 webString = 'www.baidu.com' print(webString.spl ...
- 唤醒手腕Python全栈工程师学习笔记(持久存储篇)
这个篇目是"持久存储篇",讲的就是Python操作数据库,这边介绍3种数据库,分别是MySQL.Redis.Mongodb 1. Python操作MySQL数据库 MySQL属于传 ...
- 唤醒手腕Python全栈工程师学习笔记(底层原理篇)
01.内建名称空间 在Python中,有一个内建模块,该模块中有一些常用函数,变量和类. 而该内建模块在Python启动后.且没有执行程序员所写的任何代码前,Python首先会自动加载该内建模块到内存 ...
- 唤醒手腕Python全栈工程师学习笔记(并发编程篇)
01.Process进程基本介绍 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器. 什么是进程? 进程 ...
- 唤醒手腕Python全栈工程师学习笔记(拓展调用篇)
01.利用python操作摄像头 首先介绍安装opencv-python第三方库 OpenCV 是一个开源的计算机视觉库,OpenCV 库用C语言和 C++ 语言编写,可以在 Windows.Linu ...
- 唤醒手腕Python全栈工程师学习笔记(框架应用篇)
01.Flask框架服务器 render_template模板页面传参 @app.route('/index') def index():user = {'username':'duke'}#将需要展 ...
- 唤醒手腕Python全栈工程师学习笔记(微机实验篇)
01.树莓派安装操作系统 官网下载网址:https://www.raspberrypi.org/downloads/ 官网为不同的电脑操作系统提供了烧录软件,大家可以根据不同的操作系统下载对应软件.而 ...
- 严选前端全栈工程师学习笔记
原始值和引用值类型及区别 首先原始值和引用值类型都是我们JS中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且我们JS是弱类型,动态语言,数据类型可变. 原始值(简单数据类型):存储在栈中 ...
最新文章
- OC本学习笔记Foundatio框架集
- ftp+线程池批量上传文件
- 目标检测算法YOLOv4详解
- zoj3195 联通树上三个点的路径长
- SAP新一代全栈开发工具:SAP Business Application Studio
- HALCON示例程序measure_metal_part_extended.hdev金属零件尺寸测量
- excel导出_SpringBoot实现快速导出Excel
- Java案例:Log4J基本使用
- Swing学习笔记1-----Swing组件类的层次
- KDD18 DIN Deep Interest Network for Click-Through Rate Prediction
- Linux(Ubuntu)上的VULKAN环境配置步骤记录
- 微信小程序:强大的多功能图片处理器
- Java调用阿里云对象存储OSS
- ThreadLocal介绍和源码解析
- 免费在线绘制CircRNA吸附miRNA圈图
- [sudo rm -rf /bin/] Linux误删除/bin目录恢复
- 15个非常实用的JavaScript表单验证库
- python全栈工程师薪水_python全栈+爬虫+自动化+AI=python全能工程师-挑战年薪30W+
- Python中采用scapy来构建IP数据包
- 多功能的U盘启动盘制作工具
热门文章
- 2021年高压电工考试试卷及高压电工作业考试题库
- 交谈礼仪的基本要求(1)
- 他们曾经是“笑话”,如今却成了“神话”!
- Java 求解平衡二叉树
- 2022年10月份后csdn上传付费资源的最新要求
- 经典SR锁存器(或非门)分析
- 【进阶】嫌弃Python慢,试试这几个方法?
- linux怎么查询mysql服务端口占用_linux中如何查看某个端口是否被占用
- java 数组最后一个_面试官: 100万个成员的数组取第一个和最后一个有性能差距吗?...
- 万能头文件的几个函数