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 ...
随机推荐
- ETCD:配置参数
原文地址:Configuration flags etcd通过配置文件,多命令行参数和环境变量进行配置, 可重用的配置文件是YAML文件,其名称和值由一个或多个下面描述的命令行标志组成.为了使用此文件 ...
- oracle相邻表记录交换(单双两两交换)
在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...
- C#_.NetFramework_Web项目_EXCEL数据导出
[推荐阅读我的最新的Core版文章,是最全的介绍:C#_.NetCore_Web项目_EXCEL数据导出] 项目需引用NPOI的NuGet包: A-2:EXCEL数据导出--Web项目--C#代码导出 ...
- Mybatis+Spring框架整合
1.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...
- vue $emit $on 从子组件传递数据给父组件
原理是: 子组件使用$emit发送数据,父组件使用$on,或者v-on绑定, 来监听子组件发送的数据. 子组件: <button @click="sendChildData" ...
- 【React Native】react-native之集成支付宝支付、微信支付
一.在使用支付宝支付.微信支付之前导入桥接好的头文件 github地址:https://github.com/xujianfu/react-native-pay 二.集成支付宝支付流程 RN支付宝需要 ...
- 剑指offer 27:二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成 ...
- TP5 查询mysql数据库时的find_in_set用法
$where['class_id'] = ['in', '$cid_all']; $where['id'] = ['in', $all_user_id];//或这样子 $where['title'] ...
- Python—导入自定义的模块和包(指定路径下的模块和包)
模块路径如下图: import sys sys.path.append(r"E:\project\path") print "===>", sys.arg ...
- sql客户端工具Navicat_Premiun12中文破解版
Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL.MariaDB.MongoDB.SQL Server.Oracle.PostgreSQL 和 SQLit ...