Form组件

使用form组件实现注册功能

基本用法

1.简单的form组件校验数据
校验数据
1.得写一个forms校验的类
label 对应的是前端html页面上label标签显示的别名,error_message对应的是报错信息。
widget:创建装饰器,可继承html中的类。

from django import forms
		class RegForm(forms.Form):
			# forms组件中定义的字段,默认都是必须传值的
			name = forms.CharField(max_length=6,label='用户		名',error_messages={
    'max_length':'用户名最长只能六位',
    'required':'这个字段不能为空',
})
			pwd = forms.CharField(max_length=8,min_length=3,widget=forms.PasswordInput(attrs={'class':'form-control'}))
			email = forms.EmailField(error_meaage={label='邮箱','invalid':'格式不合法'})

2.实例化RegForm传值
在views.py中创建这样一个RegForm类
注意传入的字典的key必须跟类里面的变量名一致,校验的数据可以多传,但是不能少传

res = views.RegForm({'name':'dsb','pwd':'123','email':'123@qq.com'}) 

在这里插入图片描述
3.数据是否合法
res.is_valid() 如果数据全部校验通过才为True否则均为False
4.查看校验通过的数据
res.cleaned_data 会将校验通过的数据都放入cleaned_data中b’h
5.查看校验失败的数据
res.errors 会将校验失败的数据的提示信息都放入errors中

{ ‘name’: [‘Ensure this value has at most 6 characters (it has 7).’],
‘pwd’: [‘Ensure this value has at least 3 characters (it has 2).’] }

渲染标签


form组件值渲染获取用户输入(或选择的…只要是用户操作都算)的标签
提交按钮需要我们自己手动写

三种方式:
第一种高度封装不推荐
1.{{ form_obj.as_p }}
第二种是第三种的复杂版
2.{{ form_obj.name.label }}{{ form_obj.name }}
推荐用第三种
3.{% for foo in form_obj %}   
		<p><label>{{ foo.label }}</label>
		{{ foo }}</p>
  {% endfor %}
展示报错信息

注:foo.errors.0 中的0可以获取到最原始的数据而忽略格式,并且error没有值的时候不会占空间,也不会显示。novalidate 在这里起到屏蔽浏览器启动校验的效果

屏蔽如图效果
在这里插入图片描述

<form action="" method="post" novalidate>
						{% for foo in form_obj %}
							<p>
								{{ foo.label }}{{ foo }}
								<span>{{ foo.errors.0 }}</span>
							</p>
						{% endfor %}
						<input type="submit">
					</form>
局部钩子与全局钩子

局部钩子:clean_name这个方法写在class RegForm(forms.Form):
下面,相当于重写了一个内置方法,这个方法在对象被校验的时候会自动执行
定义函数名用 def clear_字段名

from django.core.exceptions import ValidationError
				def clean_name(self):
					name = self.cleaned_data.get('name')
					if '666' in name:
						# 局部钩子中可以手动添加报错信息
						self.add_error('name','光喊666是不行的,得有操作!')
						# 也可以主动抛出异常(二选一即可,如果用add方法则不需要执行最上面那句import语句)
						# raise ValidationError('光喊666是不行的,得有操作!')
					# 拿出来校验的数据必须返回回去
					return name

全局钩子

def clean(self):
	pwd = self.cleaned_data.get('pwd')
	confirm_pwd = self.cleaned_data.get('confirm_pwd')
	if pwd == confirm_pwd:
		# 校验过后要把cleaned_data再返回出来
		return self.cleaned_data
	else:
		# 跟局部钩子不同,需要手动将报错信息加入到errors里面
		self.add_error('confirm_pwd', '两次密码不一致')

注释:局部和全局添加报错信息,都可以通过self.add_error(‘字段’,‘提示信息’) 局部钩子中还可以通过抛出异常的方式提示校验信息

Form组件与数据库联动
from app01 import models
def reg3(request):
	# 实例化一个form对象
	form_obj = RegForm()
	if request.method == 'POST':
		print(request.POST)
		# request.POST直接丢给form组件,相当于对RegForm进行字典传值。
		#还要注意传过来的值需要和form组件class声明的字段一致。
		form_obj = RegForm(request.POST)
		if form_obj.is_valid():
			models.User.objects.create(**form_obj.cleaned_data)
			return HttpResponse('ok')
	return render(request, 'reg2.html', locals())
总结:forms组件可以实现三大功能,其实它的这些功能都是给我的models.py里面的一张张模型表服务的

form组件的扩展字段:
详情参考https://www.cnblogs.com/Dominic-Ji/p/9240365.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值