Django的Form主要具有一下几大功能:
- 生成HTML标签
- 验证用户数据(显示错误信息)
- HTML Form提交保留上次提交数据
- 初始化页面显示内容
一 通过form实现校验字段功能
模型:models.py
class UserInfo(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) email = models.EmaillField() tel = models.CharField(max_length=32)
模板:register.html
<form action="", method="post"> <p>用户名 <input type="text" name="username"></p> <p>密码<input type="password" name="password"></p> <p>确认密码<input type="password" name="repwd"></p> <p>邮箱<input type="text" name="email"></p> <p>手机号<input type="text" name="tel"></p> <input type="submit"> {% csrf_token %} </form>
二 通过form组件对模板进行渲染
form校验组件
from django import forms class UserForm(forms.Form): username = forms.CharField(min_length=4) password = forms.CharField(min_length=4) repwd = forms.CharField(min_length=4) email = forms.EmailField() tel = forms.CharField
视图函数
def register(req): if req.method == 'POST': # form = UserForm({'name':'cs', 'email': '[email protected]', 'xxx':'harry'}) form = UserForm(req.POST) # 注意form表单的name属性值应该与forms组件字段名称一致 print(form.is_valid()) # 返回布尔值 if form.is_valid(): print(form.cleaned_data) # {"name":'cs", "email:'[email protected]'} else: print(form.cleaned_data) print(form.errors) # {"name":["......"]}
return HttpResponse('ok')
''' if 所有的字段校验成功,则form.cleaned_data以一个字典的形式存放所有校验通过的数据 ''' return render(req, "register.html")
form组件在模板中渲染
1 <form class="col-md-4 form-group" action="",method="post"> 2 <p> 3 用户名 {{ form.username }} 4 </p> 5 <p> 6 密码 {{ form.password }} 7 </p> 8 <p> 9 确认密码 {{ form.repwd }} 10 </p> 11 <p> 12 email {{ form.email }} 13 </p> 14 <p> 15 手机号 {{ form.tel }} 16 </p> 17 </form>
1 <form class="col-md-4 form-group" action="",method="post"> 2 {% csrf_token %} 3 {% for filed in form %} 4 <p> 5 <lable>{{ filed.label }}</lable> 6 {{ filed }} 7 </p> 8 {% endfor %} 9 </form>
展示错误信息
<form class="col-md-6" action="" method="post" novalidate> {% csrf_token %} {% for filed in form %} <p> <lable>{{ filed.label }}</lable> {{ filed }} <span>{{ filed.errors.0 }}</span> </p> {% endfor %} <input type="submit"> </form>
三 form组件的配置参数
Filed参数 required=Ture 是否必填 widget=None HTNL插件 label=None 用于生成Label标签显示内容 initial=None 初始值 help_text='' 帮助信息(在标签旁边显示) error_messages=None 错误信息{'required':'不能为空’, 'invalid':'格式错误’} show_hidden_initial=False 是否在当前插件后再加一个隐藏的具有默认值的插件(可用于两次输入是否一致) validators=[], 自定义验证规则 localize=False 是否支持本地化 disabled=False 是否可以编辑 label_suffix=None Lable内容后缀 CharField(Field) max_length=None 最大长度 min_length=None 最小长度 strip=True 是否移除用户输入空白 IntergerField(Field) max_value = None 最大值 min_value = None 最小值 DecimalField(IntergerField) max_value=None 最大值 min_value=None 最小值 max_digits=None 总长度 decimal_places=None 小数位长度 BaseTemporalField(Field) input_forats=None 时间格式化 DateField(BaseTemporalField) 格式:2015-09-01 TimeField(BaseTemporalField) 格式:11:12 DateTimeField(BaseTemporalField) 格式:2015-09-01 11:12 RegexField(charField) regex, 自定义正则表达式 max_length=None, 最大长度 min_length=None, 最小长度 error_message=None {"invalid":"..."} FileField(Field) allow_empty_file=False 是否允许空文件 ChoiceField(Field) choices=(), 选项,如:choices = ((0,'上海’),(1,,'北京') required=True 是否必填 widget=None 插件,默认select插件 label=None Label内容 initial=None 初始值 help_text='', 帮助提示 TypeChoiceField(ChoiceField) coerce = lambda val: val 对选中的值进行一次转换 empty_value = '' 空的默认值 ComboFiel(Field) fields=() 使用多个验证,如下:即验证最大程度20,又验证邮箱格式 fields.ComboField(fields=[fields.CharField(max_length=20),fields.EmailField(),] GenericIPAddressField protocol='both', both,ipv4,ipv6支持的IP格式 unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.0.2.1 可以解析为192.0.0.2.1 SlugField(CharField) 数字,字母,下划线,减号(连接符)
在form中使用组件
from django.forms import widgets class UserForm(forms.Form): username = forms.CharField(min_length=4, label='用户名', error_messages={"required": "该字段不能为空"}, widget= widgets.TextInput(attrs={'class':"form-control"})) password = forms.CharField(min_length=4, label='密码',widget=widgets.PasswordInput(attrs={'class':"form-control"})) repwd = forms.CharField(min_length=4, label='重复密码',widget= widgets.TextInput(attrs={'class':"form-control"})) email = forms.EmailField(label='邮箱', error_messages={"required": "该字段不能为空", "invalid":"格式输入错误"}, widget=widgets.TextInput(attrs={'class': "form-control"}) ) tel = forms.CharField(label="电话号码", error_messages={"required": "该字段不能为空"}, widget= widgets.TextInput(attrs={'class': "form-control"}) ) # label = '用户名' 自定义字段的label # error_messages={"required": "该字段不能为空", "invalid":"格式输入错误"} 自定义错误消息输出 # widget=widgets.PasswordInput(attrs={'class':"form-control"} 设置input的类型并赋予属