django10-form表单组件
1.form组件的主要功能
生成页面的HTML标签和样式 ,将前端form表单的代码放在后端生成!!
对用户提交的数据进行校验(正则)
自动生成错误信息
保留上次输入信息
2.form组件常用字段与插件
字段属性是对用户请求的验证
插件是对生成的HTML标签增加属性
#常用字段的通用属性 required=True #是否可以为空
widget=None #HTML插件
label=None #生成标签的label
initial=None #初始值
error_messages=None #错误信息定义
disabled=False #是否可编辑
help_text='' #帮助提示 #常用的字段
CharField(Field) #input标签输入框
max_length=None #最大长度
min_length=None #最小长度
strip=True #是否移除前后空格
#widget=forms.widgets.TextInput(attrs{'class':'bootstrap类'}) #直接改变生成的标签的属性
#widget=forms.widgets.PasswordInput(attrs={'class':'bootstrap类'}) #基于password的密文输入框
ChoiceField(Field) #单选字段(通过插件修改样式)
choices=((0,'上海'),(1,'北京')) #前后端对应数据选择
widget=forms.widgets.RadioSelect() #基于input标签的圆形单选
#widget=forms.widgets.CheckboxInput() #基于input标签的方形单选
#widget=forms.widgets.Select() #基于select标签的下拉单选
MultipleChoiceField(ChoiceField) #多选字段(通过插件修改样式)
choices=((0,'上海'),(1,'北京'))
widget=forms.widgets.SelectMultiple() #基于select的标签完成多选
#widget=forms.widgets.ChecknoxSelectMultiple() #基于inpu标签的方形多选
3.form组件简单使用
1)定义一个form组件的类 ,关键部分:
widget=form.TextInput(attrs={字典}) #插件可以定义标签的类型 ,attrs这个字典可以定义标签属性(增加bootstrap样式!)
error_messages={字典} #字段校验提示信息自定义 ,配合is_valid()使用!
choices #动态获取数据库数据 ,不要在类中写死 ,使用的是重写init方法 ,把fields字段的choices拿出来指定为数据库的值(后端 ,前端显示)
2)定义视图函数 ,将form的对象传到模板 ,关键部分:
get请求中 ,直接将form对象传给模板
post请求中, 需要重新实例化form对象 ,将返回的POST数据作为参数 ,is_vaild()校验, 其中内置的校验如required ,min_length等等字段 ,如果满足继续执行代码 ,不满足将添加了error信息的form对象传给模板(当然这种内置的字段无法满足一些要求)
3)定义模板 ,直接将form对象循环取出展示标签即可 ,关键部分:
label标签是比较重要的需要给对象中每个field设置
4)重写init方法
完成了choices从数据库中动态获取显示内容和后端内容
完成了所有输入框字段的标签,加入了bootstrap样式
#url
url(r'log/', views.log, name='log'),
#view
class LoginForm(forms.Form):
def __init__(self, *args, **kwargs):
super(LoginForm, self).__init__(*args, **kwargs)
self.fields['book'].choices = models.Book.objects.all().values_list('pk', 'name')
# 取出字典中的key遍历
for field in iter(self.fields):
if field != 'book':
self.fields[field].widget.attrs.update({'class': 'form-control'}) user = forms.CharField(
label='用户名',
required=True,
help_text='请在此处输入用户名!',
strip=True,
widget=forms.TextInput(),
)
password = forms.CharField(
label='密码',
required=True,
min_length=6,
error_messages={'required': '必须输入', 'min_length': '最小长度6位'},
widget=forms.PasswordInput()
)
book = forms.MultipleChoiceField(
label='书籍',
# choices=((0, '男'), (1, '女')),
initial=[11],
widget=forms.widgets.CheckboxSelectMultiple(),
) def log(request):
form_obj = LoginForm()
if request.method == 'POST':
form_obj = LoginForm(request.POST)
if form_obj.is_valid():
name = request.POST.get('user')
password = request.POST.get('password')
print(form_obj.errors)
return render(request, 'formtest.html', {'form_obj': form_obj})
#html
{% extends 'base.html' %}
{% block body1 %}
<form class="form-horizontal" method="post" novalidate>
{% csrf_token %}
{% for field in form_obj %}
<div class="form-group">
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }}
{{ field.errors.0 }}
</div>
{% endfor %}
<button class="btn" type="submit">提交</button>
</form>
{% endblock %}
4.form表单的数据验证方式
1)内置简单校验
通过属性实现 min_length required等等
2)内置的正则验证 ,自定义正则表达式对字段的返回值进行校验!
导入RegexValidator方法
validators=[RegexValidator(正则 ,错误提示)]
from django.core.validators import RegexValidator .... #对email字段进行正则
email = forms.CharField(
label='邮箱',
validators=[RegexValidator(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$', '邮箱格式错误')],
widget=forms.TextInput(), )
....
3)自定义方法验证 (可以应用到非法字符的校验)
导入ValidationError异常处理
写一个校验函数 ,不写return ,不满足要求raise出一个validationError的异常
validators=[函数]
from django.core.exceptions import ValidationError #不满足校验抛异常
def Desc_Valid(value):
if 'cnm' in value:
raise ValidationError('非法字符') #字段校验器指定函数
...
desc = forms.CharField(
label='描述',
widget=forms.TextInput(),
validators=[Desc_Valid]
)
...
5.源码解读is_valid() ,如何完成数据有效校验
value通过内置校验 ,自定义校验
value通过了局部钩子校验 ,类中自定义的clean_%s的方法
value通过了全局钩子校验 ,类中重写clean()方法 (可以用于多字段联合校验 ,如密码的二次确认)
clean()方法重写如果校验失败就个体一个fields添加一个errormessage ,raise一个异常 校验通过返回self中的原值cleand_data字典
def clean(self):
pwd = self.cleaned_data['password']
repwd = self.cleaned_data['repassword']
if pwd != repwd:
# 给某个fields添加错误提示
self.add_error('repassword', '密码不一致o')
# 异常处理给error
raise ValidationError('密码不一致')
return self.cleaned_data
django10-form表单组件的更多相关文章
- Form( 表单) 组件
本节课重点了解 EasyUI 中 Form(表单)组件的使用方法, 这个组件不依赖于任何组件.一. 加载方式表单组件只能在 JS 区域设置,首先定义一张表单.<form id="box ...
- 第二百二十一节,jQuery EasyUI,Form(表单)组件
jQuery EasyUI,Form(表单)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Form(表单)组件的使用方法,这个组件不依赖于 ...
- Django form表单 组件
目录 Django form表单 组件 Form 组件介绍 普通方式手写注册功能 使用form组件实现注册功能 Form 常用字段与插件 常用字段(必备) 字段参数(必备) 内置验证(必备) 自定义效 ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- 封装react antd的form表单组件
form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...
- 封装Vue Element的form表单组件
前两天封装了一个基于vue和Element的table表格组件,阅读的人还是很多的,看来大家都是很认同组件化.高复用这种开发模式的,毕竟开发效率高,代码优雅,逼格高嘛.虽然这两天我的心情很糟糕,就像& ...
- Django Form表单组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django之form表单组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- form表单组件
1.sweetalert 组件地址 form组件 form表单完成的事情,: 提供input可以提交数据, 对提交的数据进行校验,提供错误提示 定义form组件 from django impor ...
- vue3 element-plus 配置json快速生成form表单组件,提升生产力近600%(已在公司使用,持续优化中)
️本文为博客园社区首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gi ...
随机推荐
- three.js通过canvas实现球体世界平面地图
概况如下: 1.SphereGeometry实现自转的地球: 2.THREE.CatmullRomCurve3实现球体线条地图点确定: 3.THREE.Math.degToRad,Math.sin,M ...
- 原生PHP网页导出和导入excel文件实例
原生PHP实现的网页导出和导入excel文件实例,包括上传也是用的原生.还可在exportExcel方法里设置字体等表格样式. 导出和导入表单代码: <p style="margin: ...
- Hive安装、配置和使用
Hive概述 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. Hive本质是:将HQL转化成MapReduce程序. Hive处理的数据存储 ...
- Oracle数据库之第三篇
/* 起别名使用双引号 处理特殊字符使用 数据库里的字符串都是使用单引号 */ /* DDL语句 是数据定义语言 使用语句创建数据库的对象 表空间 是实例分配的一块空间 用于开发使用 创建语法: cr ...
- iTerm2 使用代理
0x00 事件 因为 brew 安装极慢,所以需要 iTerm2 设置代理解决速度问题. 0x01 解决 代理软件开启本地 Http 端口: iTerm 设置代理: $ vim ~/.zshrc # ...
- cookie,webstorage的理解
在前两天的开发时,遇到一个问题,需要将一个网页在预加载时,优先出一个弹出框,但是再次加载时不希望它出现,在经过一段时间的搜索和尝试之后,发现了大多使用的两种方式:生成cookie和webStorage ...
- Linux系统学习 三、网络基础—虚拟机网络配置
Linux网络基础 Linux的ip地址配置 Linux网络配置文件 常用网络命令 虚拟机网络参数配置 1.配置Linux的IP地址 首先配置一个IP地址,让IP生效. ifconfig查看当前网络配 ...
- mysql用户数据库只读权限提升全局权限
1.只读用户登录数据库 2.执行命令: mysql> unlock tables;mysql> set global read_only=0;
- RNN及其变体框架
RNN及其变体框架 含RNN推导 LSTM理解 理解LSTM网络 算法细节理解及参考文献
- 使用 Hbuilder 连接手机调试移动端项目
点击界面上的浏览器右侧的倒三角. 弹出列表以后,点击最后一行 “设置web服务器...”.继续弹出,点击右下角的“外置Web服务器设置”. 点新建. 弹出框后,填入“名称”和“浏览器运行U ...