最简单的 web 开发在一定程度上, 应该就是与数据库的各种交互. 增删改查并将结果友好的展示到页面上.
在完成了用户表的设计之后, 今天就需要完成数据的插入工作了.
打开 register.html, 可以看到 < form method="POST">. 也就是注册的内容会以表单的形式进行提交.
那我们新建一个 forms.py 文件进行表单的校验.
首先是用户名的约束条件: 用户名长度要大于 5, 用户名长度要小于 20, 用户名不能为空
- username = forms.CharField(label='用户名', max_length=20, min_length=5,
- error_messages={"min_length": "用户名长度要大于 5", "max_length": "用户名长度要小于 20",
- "required": "用户名不能为空"}
- )
同理密码和再次输入密码也差不多
- password = forms.CharField(label='密码', max_length=20, min_length=6,
- error_messages={"min_length": "密码长度要大于 6", "max_length": "密码长度要小于 20",
- "required": "密码不能为空"}
- )
- password_repeat = forms.CharField(label='确认密码', max_length=20, min_length=6,
- error_messages={"min_length": "密码长度要大于 6", "max_length": "密码长度要小于 20",
- "required": "密码不能为空"}
- )
email 由于数据库有限制了, 所以这边就做个非空的校验好了
- email = forms.EmailField(required=True,
- error_messages={'required': "邮箱不能为空"})
我们需要验证第一次输入的密码和再次输入的密码是一致的, 所以增加 clean 函数
所以整个 forms.py 文件为:
- import re
- from django import forms
- from .models import User
- class RegisterForm(forms.Form):
- username = forms.CharField(label='用户名', max_length=20, min_length=5,
- error_messages={"min_length": "用户名长度要大于 5", "max_length": "用户名长度要小于 20",
- "required": "用户名不能为空"}
- )
- password = forms.CharField(label='密码', max_length=20, min_length=6,
- error_messages={"min_length": "密码长度要大于 6", "max_length": "密码长度要小于 20",
- "required": "密码不能为空"}
- )
- password_repeat = forms.CharField(label='确认密码', max_length=20, min_length=6,
- error_messages={"min_length": "密码长度要大于 6", "max_length": "密码长度要小于 20",
- "required": "密码不能为空"}
- )
- email = forms.EmailField(required=True,
- error_messages={'required': "邮箱不能为空"})
- def clean(self):
- cleaned_data = super().clean()
- passwd = cleaned_data.get('password')
- passwd_repeat = cleaned_data.get('password_repeat')
- if passwd != passwd_repeat:
- raise forms.ValidationError("两次密码不一致")
下面是对 post 接口的代码编写
注册页面
输入一些正确的注册参数后, 点击注册, 触发 post 接口, 记得要在 post 函数的第一行打上断点:
断点
这样就可以看到 request 拿到的东西了
request 的内容
很容易的可以看出, 我们需要的东西都在 request.POST 里面了
request.POST
我们用类似字典取值的方式 [get] 拿出我们需要的几个值
- use_key = ['username', "password", "password_repeat", "email"]
- dict_data = {}
- for i in use_key:
- dict_data[i] = request.POST.get(i)
接下来实例化表单验证:
form = RegisterForm(data=dict_data)
使用 form.is_valid() 就可以进行验证了
以下是几个测试的结果:
通过测试
不通过测试 1
不通过测试 2
可以看到如果输入符合要求的内容表单会自动校验并返回 True.
真是省心省力的一个东西.
接下来就是把东西插入数据库了
- username = form.cleaned_data.get('username')
- password = form.cleaned_data.get('password')
- email = form.cleaned_data.get('email')
- user = User.objects.create(username=username, password=password, email=email)
- user.save()
- return render(request, 'login/index.html')
使用 create 插入数据, 使用 save 把操作生效. 打开数据库可以看到效果. 在完成注册后会自动跳转到登录界面.
数据库
接下来还做了点错误的判断:
- err_msg_list = []
- for item in form.errors.get_json_data().values():
- err_msg_list.append(item[0].get('message'))
- err_msg_str = '/'.join(err_msg_list)
- return to_json_data(errno=Code.PARAMERR, errmsg=err_msg_str)
这里面的调用关系请直接查阅源码:
https://github.com/zx490336534/Zxapitest
来源: http://www.jianshu.com/p/9e04b2f15e0d