表单可以提交数据,表单还需要做校验
假设我们需要以下的字段校验
用户名:至少6位,不能有特殊符号
密码: 数字字母混合
邮箱: 邮箱格式
电话号: 11数字
身份证: 校验接口
我们可以用前端进行校验。开发难度较低,但是前端校验不能完全防止错误数据,应为有些请求是可 以不经过网页的,所以一个安全的注册需要前后端共同校验。后端校验最简单的方法。
def formExa(request):
if request.method == "POST" and request.POST:
name = request.POST.get("name")
if name:
description = request.POST.get("description")
Type.objects.create(label = name,description = description)
types = Type.objects.all()
else:
return render(request,"index.html")
return render(request,"formTem.html",locals())
上面的方法很直观,但是不适合处理大量的校验,django为了解决这个问题,推出了Form类。
Django form表单的定义:
在app当中创建一个forms.py脚本
1、手动定义
from django import forms
class AuthorForm(forms.Form):
name = forms.CharField(max_length = 32)
age = forms.IntegerField()
birthday = forms.DateField()
email = forms.EmailField()
phone = forms.CharField(max_length = 32)
photo = forms.ImageField()
address = forms.Textarea()
2、来自于模型
from Article.models import Author
class AuthorForm_v2(forms.ModelForm):
class Meta:
model = Author
fields = "__all__"
前端效果
1、直接使用
2、As_p
3、As_ul
4、As_table(已经失效)
5、循环使用
<form class="form">
<p>+++++++++++++++as_p+++++++++++++++++++</p>
{{ authorForm.as_p }}
<p>+++++++++++++++as_ul+++++++++++++++++++</p>
{{ authorForm.as_ul }}
<p>++++++++++++++++as_table++++++++++++++++++</p>
{{ authorForm.as_table }}
</form>
<p>++++++++++++++++循环式样式++++++++++++++++++</p>
<form>
{% for field in authorForm %}
<p>
<label style="color: #3b3b1f">{{ field.label }}</label>
{{ field }}
</p>
{% endfor %}
</form>
Form类表单的修饰
Required 字段是否可以为空 True
Max_length 最大长度
Min_length 最小长度
Label 标签
Initial 初始值
Help_text 帮助文本
Error_message 错误信息
Disabled 是否可以被修改
Widget 添加前端样式
class AuthorForm(forms.Form):
name = forms.CharField(max_length = 8,required=False,min_length = 6,label = "作者姓名")
age = forms.IntegerField(label = "作者年龄")
birthday = forms.DateField(label = "作者生日")
email = forms.EmailField(label = "作者邮箱")
phone = forms.CharField(max_length = 32,label = "作者电话",widget=forms.TextInput(attrs={"style":"color:red;"}))
# photo = forms.ImageField()
address = forms.Textarea()
def clean_name(self): #名称必须是clean_要校验的字段名
name = self.cleaned_data.get("name")
if "管理员" in name:
self.add_error("name","非法命名")
else:
return name
Form表单的校验
1、校验步骤
1、获取前端提交的数据,并将数据传递form类当中
2、使用form类实例的is_valid方法进行校验
3、使用form类实例的clean_data获取校验过的数据,errors方法获取校验发生的错误
from Article.froms import AuthorForm,AuthorForm_v2
def formClass(request):
authorForm = AuthorForm() #实例化空的表单,提交到前端给用户使用
if request.method == "POST" and request.POST:
validData = AuthorForm(request.POST) #使用form类对提交回来的数据进行后端校验 --->1<----
if validData.is_valid(): #is_valid 校验没有错误返回True否则False --->2<----
cleanData = validData.cleaned_data #按照字典返回 --->3<----
else:
cleanData = validData.errors --->3<----
return render(request,"FormClass.html",locals())
2、自定义校验
1、自定义校验的方法名称必须是clean_校验字段的名称
2、通过self.clean_data方法获取校验字典的具体值
3、如果发生错误使用self.add_error(“字段名称”,”错误内容”)添加错误
from django import forms
class AuthorForm(forms.Form):
name = forms.CharField(max_length = 8,required=False,min_length = 6,label = "作者姓名")
age = forms.IntegerField(label = "作者年龄")
birthday = forms.DateField(label = "作者生日")
email = forms.EmailField(label = "作者邮箱")
phone = forms.CharField(max_length = 32,label = "作者电话",widget=forms.TextInput(attrs={"style":"color:red;"}))
# photo = forms.ImageField()
address = forms.Textarea()
def clean_name(self): #名称必须是clean_要校验的字段名 --->1<---
name = self.cleaned_data.get("name") --->2<---
if "管理员" in name:
self.add_error("name","非法命名") --->3<---
else:
return name