lijiuchangxin 2019-10-29
目录
Form组件主要的功能如下:
? 在Django项目中通常情况下我们会在需要使用Form组件的app下新建一forms.py文件,然后在该文件下书写内容.
# app下的forms.py from django import forms # 自定义一个类继承forms.Form class RegisterForm(forms.Form): username = forms.CharField(min_length=3, max_length=11) password = forms.CharField(min_length=6, max_length=11)
# Python console from app01 import views # 1.给自定义的类传一个字典 obj=views.MyRegForm({'username':'jason','password':'12','email':'123'}) # 2.判断数据是否全部合法 obj.is_valid() # 只有数据全部符合要求才会是True Out[4]: False # 3.查看符合校验规则的数据 obj.cleaned_data Out[5]: {'username': 'jason'} # 4.查看不符合条件的数据以及不符合的原因是什么 obj.errors Out[6]: { 'password': ['Ensure this value has at least 3 characters (it has 2).'], 'email': ['Enter a valid email address.'] } # 5.校验数据的时候 默认情况下类里面所有的字段都必须传值 obj = views.MyRegForm({'username':'jason','password':'123'}) obj.is_valid() Out[12]: False obj.errors Out[13]: {'email': ['This field is required.']} # 6.默认情况下可以多传 但是绝对不能少传 obj=views.MyRegForm({'username':'jason','password':'1233','email':'','xxx':'ooo'}) obj.is_valid() Out[15]: True
# forms组件指挥帮你渲染获取用户输入(输入,选择,下拉框...)的标签,提交按钮需要自己写 <p>三种渲染前端页面的方式</p> <p>第一种渲染前端页面的方式:封装程度太高了 标签样式及参数不方便调整 可扩展性差(不推荐使用) {{ form_obj.as_p }} {{ form_obj.as_ul }} </p> <p>第二种渲染页面的方式:扩展性较高 不足之处在于 需要你手写的代码量比较多(不推荐使用)</p> <p> {{ form_obj.username.label }}{{ form_obj.username }} </p> <p> {{ form_obj.password.label }}{{ form_obj.password }} </p> <p> {{ form_obj.email.label }}{{ form_obj.email }} </p> <p>第三种渲染前端页面的方式:代码量和扩展性都很高(推荐使用)</p> {% for foo in form_obj %} <p>{{ foo.label }}{{ foo }}</p> {% endfor %} 如何展示错误信息 如何取消前端帮我们做的校验 form表单中添加一个参数即可 展示错误信息 用对象点errors.0 <form action="" method="post" novalidate> {% for foo in form_obj %} <p> {{ foo.label }}:{{ foo }} <span style="color: red">{{ foo.errors.0 }}</span> </p> {% endfor %} <input type="submit"> </form>
# app下forms.py class RegisterForm(forms.Form): username = forms.CharField(min_length=3, max_length=11, lable='用户名', error_messages={ 'min_length': '用户名不能少于三位', 'required': '用户名不能为空' } ) email = forms.EmailField(lable='邮箱', error_messages={ 'required': '邮箱不能为空', 'invalid': '邮箱格式不正确', })
? 当你针对某些字段,还需要做一些额外的校验(eg:验证用户名是否含有非法字符)的时候,就需要用到钩子函数.
# app下forms.py class RegisterForm(forms.Form): username = ... password = ... re_password = ... # 局部钩子:验证用户名中是否含有傻逼字段 def clean_username(self): # 固定写法clean_字段名 username = self.cleaned_data.get('username') if '傻逼' in username: # 给username字段添加错误信息 self.add_error('username', '用户名不合法') return username # 全局钩子:验证两次密码是否一致 def clean(self): # 固定写法clean password = self.cleaned_data.get('password') re_password = self.cleaned_data.get('re_password') if password != re_password: self.add_error('re_password', '两次密码不一致') return self.cleaned_data
# app下forms.py from django import forms class RegisterForm(forms.Form): username = froms.CharField(widget=forms.widgets.TextInput()) password = froms.CharField(widget=forms.widgets.PasswordInput()) re_password = ...
# app下forms.py from django import forms class RegisterForm(forms.Form): username = froms.CharField(widget=forms.widgets.TextInput( attrs={ 'class': 'form-control' } )) password = ... re_password = ...
# app下forms.py from django import forms from django.forms import Form from django.core.validators import RegexValidator class MyForm(Form): user = forms.CharField( validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')], )