美文网首页Python学习大数据 爬虫Python AI Sql
Python全栈工程师学习笔记 | Django的模型层

Python全栈工程师学习笔记 | Django的模型层

作者: 1a076099f916 | 来源:发表于2019-01-14 16:05 被阅读3次

    Model模型

    模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。

    通常,每个模型对应数据库中唯一的一张表。

    进群进群:700341555可以获取Python各类入门学习资料!

    这是我的微信公众号【Python编程之家】各位大佬用空可以关注下,每天更新Python学习方法,感谢!

    111111111111.png

    每个模型都是django.db.models.Model的一个Python 子类。

    模型的每个属性都表示为数据库中的一个字段。

    Django 提供一套自动生成的用于数据库访问的API;

    这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳

    模型与数据库的关系

    模型(Model)负责业务对象和数据库的关系映射(ORM)

    ORM是“对象-关系-映射”的简称,主要任务是:

    根据对象的类型生成表结构

    将对象、列表的操作,转换为sql语句

    将sql查询到的结果转换为对象、列表

    为什么要用模型?

    Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据

    它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库

    配置Mysql数据库

    1.在当前环境中安装mysql

    1sudo apt-get install mysql-server
    2sudo apt install mysql-client
    3sudo 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 pymysql
    2pymysql.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)
    10
    11 #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." 可能有用的解决方式如下:
    9
    10 先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py
    11 再 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:定义数据表名称,推荐使用小写字母,

    数据表的默认名称:<app_name>_<model_name>

    例如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) values
    2('射雕英雄传','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的默认管理器

    1. 创建对象

    当创建对象时,django不会对数据库进行读写操作

    调用save()方法才与数据库交互,将对象保存到数据库中

    使用关键字参数构造模型对象很麻烦,推荐使用下面的两种之式

    说明:init方法已经在基类models.Model中使用,在自定义模型中无法使用

    1. 实例的属性

    DoesNotExist:在进行单个查询时,模型的对象不存在时会引发此异常,结合try/except使用

    1. 实例的方法

    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 5
    2Entry.objects.all()[:5]
    3#这将返回第六个到第十个对象 OFFSET 5 LIMIT 5
    4Entry.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])

    何时查询集不会被缓存:当只对查询集的部分进行求值时会检查缓存,但是如果这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,如果这部分数据已经被缓存,则直接使用缓存中的数据

    1. 字段查询

    实现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=1980)
    2filter(bpub_date__gt=date(1980, 12, 31))

    跨关联关系的查询:处理join查询

    语法:模型类名 <属性名> <比较>

    注:可以没有__<比较>部分,表示等于,结果同inner join

    可返向使用,即在关联的两个模型中都可以使用

    1filter(heroinfo_ hcontent _contains='八')

    聚合函数

    使用aggregate()函数返回聚合函数的值

    函数:Avg,Count,Max,Min,Sum

    1from django.db.models import Max
    2maxDate = list.aggregate(Max('bpub_date'))

    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)

    1. ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

    添加几条测试数据

    1. 创建项目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 templates
    11 mkdir templates/myapp 12 13 cd ..
    14
    15 $ tree myweb
    16
    17 myweb
    18 ├── myweb
    19 │ ├── init.py
    20 │ ├── settings.py
    21 │ ├── urls.py
    22 │ └── wsgi.py
    23 ├── manage.py
    24 ├── myapp
    25 │ ├── admin.py
    26 │ ├── apps.py
    27 │ ├── init.py
    28 │ ├── models.py
    29 │ ├── tests.py
    30 │ └── views.py
    31 └── templates
    32 └── myapp

    3.执行数据库连接配置,网站配置

    3.1 编辑myweb/myweb/init.py文件,添加Pymysql的数据库操作支持

    1import pymysql
    2pymysql.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...
    17
    18# 配置模板路径信息
    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]
    34
    35
    36...
    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...

    1. 定义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)
    9
    10 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)
    9
    10>>> from myapp.models import Users
    11
    12>>> Users.objects.all()
    13<QuerySet [<Users: 张三:12345678901>, <Users: aa:13456789023>]>
    14
    15>>> s = Users.objects.get(id=1)
    16
    17>>> s.id
    181
    19
    20>>> s.name
    21'张三'
    22
    23>>> s.age
    2420
    25
    26>>> s.phone
    27'12345678901'
    28
    29>>>

    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,url
    2from django.contrib import admin
    3
    4urlpatterns = [
    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 url
    2
    3from . import views
    4
    5urlpatterns = [
    6 url(r'^$', views.index, name="index"),
    7]

    5.4 编辑视图文件:myweb/myapp/views.py,内容如下

    1#from django.shortcuts import render
    2from django.http import HttpResponse
    3
    4from myapp.models import Users
    5
    6def index(request):
    7 try:
    8 s = Users.objects.get(id=1)
    9 return HttpResponse(s)
    10 except:
    11 return HttpResponse("没有找到对应的信息!")

    5.5 测试

    项目根目录下运行 python3 manage.py sunserver 0:8000 命令,开启服务:

    1[root@localhost myweb]# python3.6 manage.py runserver 0:8000
    2Performing system checks...
    3
    4System check identified no issues (0 silenced).
    5
    6July 28, 2017 - 14:01:52
    7Django 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...

    1. 配置路由信息

    打开文件: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<uid>[0-9]+)/del', views.delUsers, name="delusers"), #执行用户信息删除 11 url(r'^users/(?P<uid>[0-9]+)/edit', views.editUsers, name="editusers"), #加载用户信息编辑表单
    12 url(r'^users/update$', views.updateUsers, name="updateusers"), #执行用户信息编辑
    13]

    1. 编写视图文件: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])
    12
    13 #修改(将id值为5的age值改为30)
    14 #ob = Users.objects.get(id=5)
    15 #ob.age = 30
    16 #ob.save()
    17
    18 #删除(删除id为3的信息)
    19 #ob = Users.objects.get(id=3)
    20 #ob.delete()
    21
    22 return HttpResponse(s)
    23 except:
    24 return HttpResponse("没有找到对应的信息!")
    25
    26# 浏览用户信息
    27def indexUsers(request):
    28 # 执行数据查询,并放置到模板中
    29 list = Users.objects.all()
    30 context = {"stulist":list}
    31 return render(request,"myapp/users/index.html",context)
    32
    33# 加载添加信息表单
    34def addUsers(request):
    35 return render(request,"myapp/users/add.html")
    36
    37# 执行信息添加操作
    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)
    49
    50# 执行信息删除操作
    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)
    59
    60# 加载信息编辑表单
    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)
    69
    70# 执行信息编辑操作
    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.now
    78 ob.save()
    79 context = {'info':'修改成功!'}
    80 except:
    81 context = {'info':'修改失败!'}
    82 return render(request,"myapp/users/info.html",context)

    1. 编辑浏览信息视图文件,
      文件位置:
      myweb/templates/myapp/users/index.html

    1<!DOCTYPE html>
    2<html>
    3 <head>
    4 <meta charset="utf-8"/>
    5 <title>用户信息管理</title>
    6 <script>
    7 //自定义执行信息删除提示判断,参数uu是成功的删除url地址
    8 function doDel(uu){
    9 if(confirm("确定要删除吗?")){
    10 //网页跳转
    11 window.location=uu;
    12 }
    13 }
    14
    15 </script>
    16 </head>
    17 <body>
    18 <center>
    19
    20 {% include 'myapp/users/menu.html' %}
    21
    22 <h3>浏览用户信息</h3>
    23 <table width="800" border="1">
    24 <tr>
    25 <th>id号</th>
    26 <th>姓名</th>
    27 <th>年龄</th>
    28 <th>电话</th>
    29 <th>添加时间</th>
    30 <th>操作</th>
    31 </tr>
    32 {% for stu in stulist %}
    33 <tr>
    34 <td>{{ stu.id }}</td>
    35 <td>{{ stu.name }}</td>
    36 <td>{{ stu.age }}</td>
    37 <td>{{ stu.phone }}</td>
    38 <td>{{ stu.addtime|date:'Y-m-d H:i:s' }}</td>
    39 <td>
    40 <a href="{% url 'editusers' stu.id %}">编辑</a>
    41 <a href="javascript:doDel('{% url 'delusers' stu.id %}');">删除</a>
    42 </td>
    43 </tr>
    44 {% endfor %}
    45 </table>
    46 </center>
    47 </body>
    48</html>

    5. 编辑添加表单视图文件
    文件位置:

    myweb/templates/myapp/users/add.html

    1<!DOCTYPE html>
    2<html>
    3 <head>
    4 <meta charset="utf-8"/>
    5 <title>用户信息管理</title>
    6 </head>
    7 <body>
    8 <center>
    9 {% include "myapp/users/menu.html" %}
    10
    11 <h3>添加用户信息</h3>
    12 <form action="{% url 'insertusers' %}" method="post">
    13 {% csrf_token %}
    14 <table width="280" border="0">
    15 <tr>
    16 <td>姓名:</td>
    17 <td><input type="text" name="name"/></td>
    18 </tr>
    19 <tr>
    20 <td>年龄:</td>
    21 <td><input type="text" name="age"/></td>
    22 </tr>
    23 <tr>
    24 <td>电话:</td>
    25 <td><input type="text" name="phone"/></td>
    26 </tr>
    27 <tr>
    28 <td colspan="2" align="center">
    29 <input type="submit" value="添加"/>
    30 <input type="reset" value="重置"/>
    31 </td>
    32 </tr>
    33 </table>
    34 </form>
    35 </center>
    36 </body>
    37</html>

    1. 编辑信息表单视图文件
      文件位置:

    myweb/templates/myapp/users/edit.html

    1<!DOCTYPE html>
    2<html>
    3 <head>
    4 <meta charset="utf-8"/>
    5 <title>用户信息管理</title>
    6 </head>
    7 <body>
    8 <center>
    9 {% include "myapp/users/menu.html" %}
    10 <h3>修改用户信息</h3>
    11 <form action="{% url 'updateusers' %}" method="post">
    12 <input type="hidden" name="id" value="{{ user.id}}"/>
    13 {% csrf_token %}
    14 <table width="280" border="0">
    15 <tr>
    16 <td>姓名:</td>
    17 <td><input type="text" name="name" value="{{ user.name }}"/></td>
    18 </tr>
    19 <tr>
    20 <td>年龄:</td>
    21 <td><input type="text" name="age" value="{{ user.age }}"/></td>
    22 </tr>
    23 <tr>
    24 <td>电话:</td>
    25 <td><input type="text" name="phone" value="{{ user.phone }}"/></td>
    26 </tr>
    27 <tr>
    28 <td colspan="2" align="center">
    29 <input type="submit" value="编辑"/>
    30 <input type="reset" value="重置"/>
    31 </td>
    32 </tr>
    33 </table>
    34 </form>
    35 </center>
    36 </body>
    37</html>

    1. 编辑公共导航栏页视图文件
      文件位置:

    myweb/templates/myapp/users/menu.html

    1 <h2>用户信息管理</h2>
    2 <a href="{% url 'users' %}">浏览用户</a> |
    3 <a href="{% url 'addusers' %}">添加用户</a>
    4


    文件位置:

    myweb/templates/myapp/users/info.html

    1<!DOCTYPE html>
    2<html>
    3 <head>
    4 <meta charset="utf-8"/>
    5 <title>用户信息管理</title>
    6 </head>
    7 <body>
    8 <center>
    9 {% include "myapp/users/menu.html" %}
    10
    11 <h3>{{ info }}</h3>
    12
    13 </center>
    14 </body>
    15</html>

    相关文章

      网友评论

        本文标题:Python全栈工程师学习笔记 | Django的模型层

        本文链接:https://www.haomeiwen.com/subject/tgcjdqtx.html