以前的文章写过表单,表单提交,再到视图函数里面去验证,但是自己写很麻烦,Django提供了组件.
先看看自己写的表单:
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/reg" method="post">
{% csrf_token %}
<p>
用户名:
<input type="text" name="username">
{{ error.username }}
</p>
<p>
密码:
<input type="password" name="pwd">
<span>{{ error.pwd }}</span>
</p>
<p>
<input type="submit">
</p>
</form>
</body>
</html>
视图函数:
做的验证是密码数量
def reg(request):
error_msg = {"pwd":"","username":""}
if request.method == "POST":
name = request.POST.get("username")
pwd = request.POST.get("pwd")
if len(pwd) < 6:
error_msg["pwd"] = "密码不能小于6位"
return render(request,'reg.html',{"error":error_msg})
再看看Django提供的组件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="reg2" method="post">
{% csrf_token %}
{{ form_obj.as_p}}
{{ form_obj.errors }}
<p><input type="submit"></p>
</form>
</body>
</html>
只写了一个表框架,一个submit按钮,其他的都由后台生成发送到前端.
先导入from组件,定义一些input的框,这里的写法很像是模型
from django import forms
class RegForm(forms.Form):
name = forms.CharField(max_length=16,label="username")
pwd = forms.CharField(label="password",min_length=6,max_length=24,
error_messages={
"min_length":"密码最短为6位",
"max_length":"密码最长为24位"
})
def reg2(request):
form_obj = RegForm()
if request.method == "POST":
form_obj = RegForm(request.POST)
#让form组件帮助做校验
if form_obj.is_valid():
pass
return render(request,"reg2.html",{"form_obj":form_obj})
pwd = forms.CharField(label="password",min_length=6,max_length=24,
error_messages={
"min_length":"密码最短为6位",
"max_length":"密码最长为24位"
})
label设置名字,后面两个参数是做校验的最大长度和最小长度.
最后一个参数是发送的错误信息.
form组件用法
-
from django import forms
-
定义一个form类
class RegFrom(from.From):生成html
3.实例化一个from对象,传递到模板语言中
3. 在目标语言中调用form对象相应的方法和属性
做校验:
1.from_obj = RegFrom(request.POST)
2.from_obj.is_valid()
校验函数
注册,密码啥的没有问题就存入数据库吧!
def reg2(request):
form_obj = RegForm()
if request.method == "POST":
form_obj = RegForm(request.POST)
# 让form组件帮助做校验
if form_obj.is_valid():
# pass
# 校验通过,把数据存在数据库
# 所以进过校验的数据form_obj.cleaned_data
# 用**解开这个大字典
models.UserInfo.objects.create(**form_obj.cleaned_data)
return render(request, "reg2.html", {"form_obj": form_obj})
关键代码
models.UserInfo.objects.create(**form_obj.cleaned_data)