forms组件

forms组件
		-forms是什么?
			就是一个类,可以校验字段(前台传过来的字段)
		-怎么用:
		-校验字段功能:
			-先写一个类,继承Form
			from django.shortcuts import render, HttpResponse
			from django import forms
			# 写一个类,要校验那些字段,就是类的属性
			class MyForm(forms.Form):
				# 定义一个属性,可以用来校验字符串类型
				# 限制最大长度是8,最小长度是3
				name=forms.CharField(max_length=8,min_length=3)
				pwd=forms.CharField(max_length=8,min_length=3,required=True)
				# 校验是否是邮箱格式
				email=forms.EmailField()
			-使用:
				#实例化产生对象,传入要校验的数据(字典)
				myform=MyForm(request.POST)
				# is_valid如果是true表示校验成功,反之,校验失败
				if myform.is_valid():
					# 校验通过的数据
					print(myform.cleaned_data)
					return HttpResponse('校验成功')
				else:
					print(myform.cleaned_data)
					#校验失败的信息
					print(myform.errors)
			-注意:校验的字段,可以多,但是不能少
		-渲染模板
			-第一中方式:(灵活性最高)
				<form action="" method="post" >
					<p>用户名: {{ myform.name }}</p>
					<p>密码: {{ myform.pwd }}</p>
					<p>邮箱: {{ myform.email }}</p>
					<input type="submit" value="提交">
				</form>
			-第二种方式:for循环form对象(用的比较多):
				<form action="" method="post" >
					{% for foo in myform %}
						<p>{{ foo.label }}:{{ foo }}</p>
					{% endfor %}
					<input type="submit" value="提交">
				</form>
			-第三种方式(不建议用):
				<form action="" method="post" >

			{#    {{ myform.as_p }}#}
				{{ myform.as_ul }}
				<input type="submit" value="提交">
				</form>
				
		-渲染错误信息
			- myforms有errors
			-属性(name)也有errors
			-错误信息,变成中文:
				- error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填','invalid': '不符合邮箱格式'}
			-给input标签指定样式,指定格式:
				 -widget=widgets.TextInput(attrs={'class':'form-control'})
			-模板,渲染错误信息:<span>{{ myform.name.errors.0 }}</span>
		-局部钩子校验
			-定义一个函数,名字叫:clean_字段名字,内部,取出该字段,进行校验,如果通过,将该字段返回,如果失败,抛异常(ValidationError)
			-   def clean_name(self):
					# self:当前form对象
					name = self.cleaned_data.get('name')
					if name.startswith('sb'):
						# 失败,抛异常
						raise ValidationError('不能以傻逼开头')
					# 正常,把name返回
					return name
		-全局钩子
			#重写clean方法
			def clean(self):
				#程序能走到该函数,前面校验已经通过了,所以可以从cleaned_data中取出密码和确认密码		
				pwd=self.cleaned_data.get('pwd')
				re_pwd=self.cleaned_data.get('re_pwd')
				#进行自己的校验
				if pwd==re_pwd:
					#通过,直接返回cleaned_data
					return self.cleaned_data
				else:
					#失败,抛异常(ValidationError)
					raise ValidationError('两次密码不一致')



二代码示范
from django.shortcuts import render, HttpResponse,redirect

# forms组件数据校验的功能
# 第一步:先要继承Form
from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError


# 写一个类
class MyForm(forms.Form):
# 定义一个属性,可以用来校验字符串类型
# 限制最大长度是8,最小长度是3
name = forms.CharField(max_length=8, min_length=3, label='用户名',
error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},
widget=widgets.TextInput(attrs={'class': 'form-control'}))
pwd = forms.CharField(max_length=8, min_length=3, required=True, label='密码',
error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},
widget=widgets.PasswordInput())
re_pwd = forms.CharField(max_length=8, min_length=3, required=True, label='确认密码',
error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填'},
widget=widgets.PasswordInput())
# 校验是否是邮箱格式
email = forms.EmailField(label='邮箱', error_messages={'required': '这个必须填', 'invalid': '不符合邮箱格式'})

# aa = forms.CharField(label='选择', error_messages={'required': '这个必须填', 'invalid': '不符合邮箱格式'},widget=widgets.CheckboxInput())
def clean_name(self):
# self:当前form对象
name = self.cleaned_data.get('name')
if name.startswith('sb'):
# 失败,抛异常
raise ValidationError('不能以傻逼开头')
# 正常,把name返回
return name

def clean(self):
pwd=self.cleaned_data.get('pwd')
re_pwd=self.cleaned_data.get('re_pwd')
if pwd==re_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致')



# Create your views here.
# def index_form(request):
# # 生成对象时(实例化),需要传入要校验的数据(字典)
# dic={'name':'lq','pwd':'123','email':'33@qq.com'}
#
# myform=MyForm(dic)
# # is_valid如果是true表示校验成功,反之,校验失败
# if myform.is_valid():
# # 校验通过的数据
# print(myform.cleaned_data)
# return HttpResponse('校验成功')
# else:
# print(myform.cleaned_data)
# # 错误信息,它是一个字典
# print(myform.errors)
# print(myform.errors.as_data())
# print(type(myform.errors))
# from django.forms.utils import ErrorDict
# return HttpResponse('校验失败')

# 数据从前端传过来,校验
# 要校验的字典,可以多参数,但是不能少
# def index_form(request):
# # 生成对象时(实例化),需要传入要校验的数据(字典)
# if request.method=='GET':
# return render(request,'indxe.html')
# elif request.method=='POST':
# print(request.POST)
# myform=MyForm(request.POST)
# # is_valid如果是true表示校验成功,反之,校验失败
# if myform.is_valid():
# # 校验通过的数据
# print(myform.cleaned_data)
# return HttpResponse('校验成功')
# else:
# print(myform.cleaned_data)
# # 错误信息,它是一个字典
# print(myform.errors)
# print(myform.errors.as_data())
# print(type(myform.errors))
# from django.forms.utils import ErrorDict
# return HttpResponse('校验失败')


# 渲染模板
# def index_form(request):
# # 生成对象时(实例化),需要传入要校验的数据(字典)
# myform=MyForm()
# if request.method=='GET':
# return render(request,'indxe2.html',locals())


# 渲染错误信息
from app01 import models
def index_form(request):
# 生成对象时(实例化),需要传入要校验的数据(字典)
if request.method == 'GET':
myform = MyForm()
elif request.method == 'POST':
myform = MyForm(request.POST)
if myform.is_valid():
print(myform.cleaned_data)

# models.User.objects.create(name='lqz',pwd='123',re_pwd='123)
myform.cleaned_data.pop('re_pwd')
models.User.objects.create(**myform.cleaned_data)
return redirect('http://www.baidu.com')
else:
all_error = myform.errors.get('__all__')
if all_error:
all_error=all_error[0]
# print(myform.errors.as_data)

return render(request, 'indxe3.html', locals())
posted @ 2018-11-21 15:00  不沉之月  阅读(156)  评论(0)    收藏  举报