书籍名称:[Python3 自动化软件发布系统-Django2 实战]
Django 表单 Form
Django Form 的特点
在之前的小节中,提前使用了一个 Django 的 Form 表单功能,当时代码如下:
1 | from django import forms |
在这里,我们多了解一下关于 Django Form 的一些知识。
Django Form 是 Django 的表单处理库。依赖 HttpRequest,它具有如下特点:
- 快速自动生成 HTML 表单;
- 表单数据验证;
- 错误信息提示;
- 自动转换为 Python 数据格式。
Django Form 的内置字段
Django 的 Form 为我们提供了一些常用的内置字段,如 BooleanField,CharField,ChoiceField,DateField,DateTimeField,EmailField,FileField,FloatField,ImageField 等。
而在每个 Field 中,也提供了 labels, wigets, error_messages 等参数;其中 wigets 参数用于控制 Form 在网页中的样式,需要好好掌握;
Django Form 的渲染
在上一小节中,没有使用表单内置的渲染功能,而是手工一个字段一个字段地进行布置。其实,在有些标准化的展示中,Form 表单可以支持更快的渲染方式:
{{ form.as_table }}
:将表单渲染成一个表格元素,每个输入框作为一个<tr>
标签;{{ form.as_p }}
: 将表单的每个输入框包裹在一个<p>
标签内;{{ form.as_ul }}
:将表单渲染成一个列表元素,每个输入框作为一个<li>
标签。
Django Form 后台验证
- 函数 full_clean() 依次调用每个 field 的 clean() 函数,该函数针对 field max_length,unique 等约束进行验证,如果验证成功则返回值,否则抛出 ValidationError 错误。如果有值返回,则放入 Form 的 cleaned_data 字典中;
- 如果每个 field 的内置 clean() 函数都没有抛出 ValidationError 错误,则调用以 clean_ 开头,以 field 名字结尾的自定义 field 验证函数。验证成功与失败的处理方式同步骤 1;
- 调用 form 的 clean() 函数。注意,这是是 Form 的 clean,而不是 field 的 clean()。如果 clean 没有错误,那么它将返回 cleaned_data 字典;
- 如果到这一步没有 ValidationError 错误抛出,那么 cleaned_data 字典就填满了有效数据;否则 cleaned_data 不存在,Form 的另外一个字典 errors 填上验证错误。在 template 中,每个 field 获取自己错误的方式是: {{ form.username.errors }}
- 如果有错误,则 is_valid() 返回 False,否则返回 True。
Django 后台 Admin
Django 作为一个 Web 框架,相比于其他框架来说,还有一个开发者很喜欢的功能。它提供了一个开箱即用的后台管理功能,即平时俗称的 Django Admin。有了这个管理功能,当我们建好 Model 之后,就可以在后台的 Web 界面上进行数据库的增删改查了,这将大大方便平时的数据管理。
Admin 界面登录
在前面的实践中,运行了
python manage.py migrate
命令,将 Django 自带的数据表合并到了数据库,并且运行过python manage.py createsuperuser
创建管理员;这样就可以通过访问http://127.0.0.1:8000/admin/
这个URL,看到 Admin 的登录界面。在登录界面中输入用户名和密码,就进入了 Admin 的 UI 界面;而且在这个界面中,可以对系统的用户和用户组进行增删改查。
应用 Model 的注册
在通过 python manage.py startapp
命令,创建了 Django 的应用之后,会在 APP的目录下生成一个 admin.py 文件。这个文件默认是空的。正是通过这个文件,我们可以将自己创建的 Model 注册到 Django Admin 的后台管理上。
打开 bbs 目录下的 admin 文件,输入以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14from django.contrib import admin
from bbs.models import Board, Topic, Post
class BoardAdmin(admin.ModelAdmin):
pass
class TopicAdmin(admin.ModelAdmin):
pass
class PostAdmin(admin.ModelAdmin):
pass代码解释:
- 第4行,注册后台管理数据库,有两种方法:
admin.site.register(Board)
和使用装饰器的@admin.register(Board)
。在这里,我们使用后面才推出的装饰器方法;它可以让注册方法和自定义 Model 管理功能紧靠在一起;
- 第4行,注册后台管理数据库,有两种方法:
重启一次 Django 测试服务器;
再次登录 Admin,就会看到我们自定义的 Board,Topic,Post 数据表,已经出现在后台管理界面上,且同样可以进行每条记录的管理
Model Admin 自定义管理界面
上面,我们已经实现了后台管理的基本功能,但是 Django 还为我们提供了更多,它可以让我们自定义一些表现形式,实现更方便的搜索,导航,外键的显示。
我们将上面的 TopicAdmin 类更改为如下内容,其作用已经在注释中说明了:
1 |
|
Django 测试
单元测试用例写的越多越好,但在一般的工作中,留给开发人员写测试用例的时间并不是很多。所以我们会将测试用例集中于 Django 的三个主要方面:Model,View 和 Form,辅以 Mock 和 API 测试;
在单元测试方面,Django 继承 Python 的 unittest,TestCase,实现了自己的 django.test.TestCase,编写测试用例通常从这里开始。测试代码通常位于 APP 的 test.py 文件中。如果测试用例较多,也可以在 APP 目录下新建 tests 文件夹,在这个文件夹内,按测试用例的大类,分文件存放。比如,我们的 Manabe 项目,就是在 test_models.py、test_views.py、test_forms.py 这样的文件中存放的。
可以使用以下几种方式运行单元测试:
1 | python manage.py test # 执行所有的测试用例 |
关于 Django 的单元测试,还有以下两项需要提前了解:
- 对于每一个测试方法,都会将 TestCase 类中 setUp() 和 tearDown() 方法执行一遍;
- 单独新建一个测试数据库来执行数据的测试,默认在测试完成后销毁;