(1)介绍
- Forms组件是用来处理用户提交的数据,并将其转换成Python可处理的数据类型。Forms组件提供了一种简单的方式来定义表单的结构以及验证用户输入的数据。通过使用Forms组件,你可以有效地处理用户输入的数据,包括验证、转换以及显示错误信息。
(2)基本使用
| from django import forms |
| |
| class MyForm(forms.Form): |
| username = forms.CharField(max_length=8,min_length=3) |
| password = forms.CharField(max_length=8,min_length=3) |
| email = forms.EmailField() |
(3)校验数据
| form_obj = MyForm({'username':'heart','password':'123','email':'123'}) |
(1)校验数据是否合法
.is_valid()
校验数据是否合法
- 只有在所有的数据全部合法的情况下才会返回True
(2)查看所有校验通过的数据
cleaned_data
查看所有校验通过的数据
- 必须配合
.is_valid()
一起使用,否则会报错
(3)查看未校验通过的数据
errors
查看所有不符合校验规则以及不符合的原因
(4)渲染到前端
| from django import forms |
| |
| class MyForm(forms.Form): |
| username = forms.CharField(max_length=8,min_length=3,label='用户名') |
| password = forms.CharField(max_length=8,min_length=3) |
| email = forms.EmailField() |
| |
| def index(request): |
| form_test = MyForm() |
| return render(request, 'index.html',locals()) |
(1)第一种渲染方式
- 实例化对象
.as_p
as_ul
as_table
- 代码书写极少 封装程度太高 不利于后期扩展 一般只在本地测试使用
| <body> |
| {{ form_test.as_p }} |
| </body> |

| <body> |
| {{ form_test.as_ul }} |
| </body> |

| <body> |
| {{ form_test.as_table }} |
| </body> |

(2)第二种渲染方式
| <body> |
| {{ form_test.username.label }} {{ form_test.username }} |
| </body> |

(3)第三种渲染方式(推荐使用)
| <body> |
| {% for form in form_test %} |
| <p>{{ form.label }}:{{ form }}</p> |
| {% endfor %} |
| </body> |

| <form action="" method="post" novalidate> |
| def index(request): |
| form_test = MyForm() |
| if request.method =='POST': |
| form_test = MyForm(request.POST) |
| if form_test.is_valid(): |
| return HttpResponse('ok') |
| return render(request, 'index.html',locals()) |
| <form action="" method="post" novalidate> |
| {% for form in form_test %} |
| <p> |
| {{ form.label }}:{{ form }} |
| <span style="color: red"> {{ form.errors.0 }}</span> |
| </p> |
| {% endfor %} |
| <input type="submit" class="btn btn-info"> |
| </form> |
- 必备的条件:get请求和post传给html页面对象变量名必须一样
- forms组件当你的数据不合法的情况下,会保存上一次的数据,可以基于之前的结果进行修改
(1)自定制错误信息
| class MyForm(forms.Form): |
| username = forms.CharField(max_length=8, min_length=3, label='用户名', |
| error_messages={ |
| 'required': '用户名不能为空', |
| 'max_length': '用户名长度不能超过8个字符', |
| 'min_length': '用户名长度不能少于3个字符' |
| }) |
| password = forms.CharField(max_length=8, min_length=3, label='密码', |
| error_messages={ |
| 'required': '密码不能为空', |
| 'max_length': '密码长度不能超过8个字符', |
| 'min_length': '密码长度不能少于3个字符' |
| }) |
| email = forms.EmailField( |
| error_messages={ |
| 'required': '邮箱不能为空', |
| 'invalid': '邮箱格式不正确' |
| } |
| ) |
(6)钩子函数hook
(1)局部钩子
| class MyForm(forms.Form): |
| username = forms.CharField(max_length=8, min_length=3, label='用户名', |
| error_messages={ |
| 'required': '用户名不能为空', |
| 'max_length': '用户名长度不能超过8个字符', |
| 'min_length': '用户名长度不能少于3个字符' |
| }) |
| def clean_username(self): |
| username = self.cleaned_data.get('username') |
| if '666' in username: |
| |
| |
| self.add_error('username', '用户名中不能包含666') |
| return username |
(2)全局钩子
| class MyForm(forms.Form): |
| password = forms.CharField(max_length=8, min_length=3, label='密码', |
| error_messages={ |
| 'required': '密码不能为空', |
| 'max_length': '密码长度不能超过8个字符', |
| 'min_length': '密码长度不能少于3个字符' |
| }) |
| confirm_password = forms.CharField(max_length=8, min_length=3, label='确认密码', |
| error_messages={ |
| 'required': '确认密码不能为空', |
| 'max_length': '确认密码长度不能超过8个字符', |
| 'min_length': '确认密码长度不能少于3个字符' |
| }) |
| def clean(self): |
| password = self.cleaned_data.get('password') |
| confirm_password = self.cleaned_data.get('confirm_password') |
| if password != confirm_password: |
| self.add_error('confirm_password', '两次密码不一致') |
| |
| return self.cleaned_data |
(1)label
命名
| name = forms.CharField(label='昵称') |
(2)error_messages
自定义报错信息
| email = forms.EmailField( |
| error_messages={ |
| 'required': '邮箱不能为空', |
| 'invalid': '邮箱格式不正确' |
| } |
| ) |
(3)initial
默认值
| name = forms.CharField(initial='heart') |
(4)required
控制是否必填
| name = forms.CharField(required=False) |
| widget=forms.widgets.TextInput() |
| widget=forms.widgets.PasswordInput() |
| widget=forms.widgets.EmailInput() |
| |
| |
| widget=forms.widgets.TextInput(attrs={'class':'form-control c1 c2','username':'heart'}) |
(6)validators
正则校验
| validators=[ |
| RegexValidator(r'^[0-9]+$','请输入数字'), |
| RegexValidator(r'^156[0-9]+$','数字必须以156开头'), |
| ] |
(7)radio
单选
| gender = forms.ChoiceField( |
| choices=((1, '男'), (2, '女'), (3, '保密')), |
| label='性别', |
| initial=3, |
| widget=forms.widgets.RadioSelect() |
| ) |
(8)select
选择下拉框
| hobby = forms.ChoiceField( |
| choices=((1, '篮球'), (2, '足球'), (3, '乒乓球')), |
| label='爱好', |
| initial=3, |
| widget=forms.widgets.Select() |
| ) |
(9)select
多选下拉框
| hobby = forms.MultipleChoiceField( |
| choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"), ), |
| label="爱好", |
| initial=[1, 3], |
| widget=forms.widgets.SelectMultiple() |
| ) |
(10)checkbox
单选框
| keep = forms.ChoiceField( |
| label="是否记住密码", |
| initial="checked", |
| widget=forms.widgets.CheckboxInput() |
| ) |
(11)checkbox
多选框
| hobby = forms.MultipleChoiceField( |
| choices=((1, "篮球"), (2, "足球"), (3, "乒乓球"),), |
| label="爱好", |
| initial=[1, 3], |
| widget=forms.widgets.CheckboxSelectMultiple() |
| ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通