forms模块
Django中的forms模块
在Django中提供了 forms 模块,用forms 模块可以自动生成form内部的表单控件,同时在服务器端可以用对象的形式接收并操作客户端表单元素,并能对表单的数据进行服务器端验证
一forms模块的作用
通过 forms 模块,允许将表单与class相结合,允许通过 class 生成表单
二使用 forms 模块的步骤
1.在应用中创建 forms.py
2.导入 django 提供的 forms
from django import forms
3.创建class,一个class会生成一个表单
#定义表单类 class ClassName(forms.Form): ...
4.在 class 中创建类属性
一个类属性对应到表单中是一个控件
5.利用Form 类型的对象自动成表单内容
6.读取form表单并进行验证数据
三form.Form的语法
属性 = forms.Field类型(参数)
1.类型
class XXX(froms.Form): forms.CharField() : 文本框 <input type="text"> forms.ChoiceField() : 下拉选项框 <select> forms.DateField() : 日期框 <input type="date"> ... ...
2.参数
- label:控件前的文本
- widget:指定小部件
- initial:控件的初始值(主要针对文本框类型)
- required:是否为必填项,值为(True/False)
form表单示例
手动实现Form表单
<form action="/test_form1" method="post"> <div> <label for="id_input_text">请输入内容:</label> <input type="text" name="input_text" id="id_input_text" /> </div> <button type="submit">提交</button> </form>
Django Form 实现 Form 表单
class MySearch(forms.Form): input_text = forms.CharField(label = '请输入内容')
四在模板中解析form对象
1.方法
需要自定义
表单中的按钮需要自定义
2.解析from对象
在 视图中创建form对象并发送到模板中解析. ex: form = XXXForm() return render(request,'xx.html',locals())
(1)手动解析 {% for field in form %}
field : 表示的是form对象中的每个属性(控件)
{{field.label}} : 表示的是label参数值
{{field}} : 表示的就是控件
{% endfor %}
(2)自动解析
{{form.as_p}} 将form中的每个属性(控件/文本)都使用p标记包裹起来再显示
{{form.as_ul}} 将form中的每个属性(控件/文本)都使用li标记包裹起来再显示
注意:必须手动提供ol 或 ul 标记
{{form.as_table}} 将 form 中的每个属性(控件/文本)都使用tr标记包裹起来再显示
注意:必须手动提供table标记
五通过 forms 对象获取表单数据
1.通过 forms.Form 子类的构造器来接收 post 数据
form = XXXForm(request.POST)
2.必须是 form 通过验证后,才能取值
form.is_valid()
返回True:通过验证,可以取值
返回False:暂未通过验证,则不能取值
3.通过 form.cleaned_data 字典的属性接收数据
form.cleaned_data : dict 类型
六Field 内置小部件 - widget
1.什么是小部件
表示的是生成到网页上的控件以及一些其他的html属性
message=forms.CharField(widget=forms.Textarea)
upwd=forms.CharField(widget=forms.PasswordInput)
2.常用的小部件类型
widget名称 | 对应和type类值 |
TextInput | type='text' |
PasswordInput | type='password' |
NumberInput | type="number" |
EmailInput | type="email" |
URLInput | type="url" |
HiddenInput | type="hidden" |
CheckboxInput | type="checkbox" |
CheckboxSelectMultiple | type="checkbox" |
RadioSelect | type="radio" |
Textarea | textarea标记 |
Select | select标记 |
SelectMultiple | select multiple 标记 |
3.小部件的使用
(1)继承子forms.Form
语法
属性 = forms.CharField() #无预选值使用 text,password,email,url,textarea,checkbox 属性 = forms.ChoiceField() #有预选值使用 checkbox,radio,select 属性 = forms.CharField( label='xxx', widget=forms.小部件类型 )
示例
upwd = forms.CharField( label='用户密码', widget=forms.PasswordInput ) message = forms.CharField( label='评论内容', widget=forms.Textarea )
文档参见https://docs.djangoproject.com/en/1.11/topics/forms/
七form表单验证
django form 提供表单和字段验证
当在创建有不同的多个表单需要提交的网站时,用表单验证比较方便验证的封装
当调用form.is_valid() 返回True表示当前表单合法,当返回False说明表单验证出现问题
验证步骤:
1.先对form.XXXField() 参数值进行验证,比如:min_length,max_length, validators=[...],如果不符合form.is_valid()返回False
2.对各自from.clean_zzz属性名(self): 方法对相应属性进行验证,如果验证失败form.is_valid()返回False
3.调胳form.clean(self): 对表单的整体结构进行验证,如果验证失败form.is_valid()返回False
4.以上验证都成功 form.is_valid()返回True
验证方法:
validators = [验证函数1, 验证函数1]
验证函数验证失败抛出forms.ValidationError
验证成功返回None
def clean_xxx属性(self):
验证失败必须抛出forms.ValidationError
验证成功必须返回xxx属性的值
def clean(self):
验证失败必须抛出forms.ValidationError
验证成功必须返回 self.cleaned_data
from django import forms import re mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') def mobile_validate(value): if not mobile_re.match(value): raise forms.ValidationError('手机号码格式错误') class RegisterForm(forms.Form): username = forms.CharField(label='用户名') password = forms.CharField(label='请输入密码', widget=forms.PasswordInput) password2 = forms.CharField(label='再次输入新密码', widget=forms.PasswordInput) mobile = forms.CharField(label='电话号码', validators=[mobile_validate]) def clean(self): pwd1 = self.cleaned_data['password'] pwd2 = self.cleaned_data['password2'] if pwd1 != pwd2: raise forms.ValidationError('两次密码不一致!') return self.cleaned_data # 必须返回cleaned_data def clean_username(self): username = self.cleaned_data['username'] if len(username) < 6: raise forms.ValidationError("用户名太短") return username