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

Model模型


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

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


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

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

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

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


模型与数据库的关系


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


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


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

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

  3. 将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中

  • 使用方式

  1. 导入from django.db import models

  2. 通过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的默认管理器


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 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])


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


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=[12345])


  • 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(19801231))

跨关联关系的查询:处理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`)                                   
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 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...


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)
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 201701: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 282017 - 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...


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<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]


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])
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)


4. 编辑浏览信息视图文件,

文件位置:

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>



6. 编辑信息表单视图文件

文件位置:

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>



7. 编辑公共导航栏页视图文件

文件位置:

myweb/templates/myapp/users/menu.html

 

 
 

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


文件位置:

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>




福利

公众号后台回复:2018Python,获取2018Python开源项目Top100整理资料!或扫码添加小助手微信,回复:1,入群获取。


640?wx_fmt=jpeg



推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值