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表单组件的更多相关文章

  1. Form( 表单) 组件

    本节课重点了解 EasyUI 中 Form(表单)组件的使用方法, 这个组件不依赖于任何组件.一. 加载方式表单组件只能在 JS 区域设置,首先定义一张表单.<form id="box ...

  2. 第二百二十一节,jQuery EasyUI,Form(表单)组件

    jQuery EasyUI,Form(表单)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Form(表单)组件的使用方法,这个组件不依赖于 ...

  3. Django form表单 组件

    目录 Django form表单 组件 Form 组件介绍 普通方式手写注册功能 使用form组件实现注册功能 Form 常用字段与插件 常用字段(必备) 字段参数(必备) 内置验证(必备) 自定义效 ...

  4. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  5. 封装react antd的form表单组件

    form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...

  6. 封装Vue Element的form表单组件

    前两天封装了一个基于vue和Element的table表格组件,阅读的人还是很多的,看来大家都是很认同组件化.高复用这种开发模式的,毕竟开发效率高,代码优雅,逼格高嘛.虽然这两天我的心情很糟糕,就像& ...

  7. Django Form表单组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  8. Django之form表单组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  9. form表单组件

    1.sweetalert 组件地址 form组件 form表单完成的事情,:   提供input可以提交数据, 对提交的数据进行校验,提供错误提示 定义form组件 from django impor ...

  10. vue3 element-plus 配置json快速生成form表单组件,提升生产力近600%(已在公司使用,持续优化中)

    ️本文为博客园社区首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农‍♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gi ...

随机推荐

  1. 深蓝词库转换2.5发布——支持微软五笔,支持Linux和macOS和更多命令行功能

    最近利用晚上的时间,对很久没有新版本发布的深蓝词库转换进行了版本升级.本次升级主要包含的功能包括: 一.支持Win10自带的微软五笔输入法用户自定义短语的导入导出. 1.在转换输入法词库列表中选择“W ...

  2. robot用例执行常用命令(转)

    执行命令 执行一个用例 robot -t “testcase_name“ data_test.robot 按用例文件执行 robot data_test.robot或者 robot --suite “ ...

  3. Cypress 之 URL访问

    visit 作用: 访问一个远程URL. (建议:使用前设置 baseUrl) 语法: cy.visit(url) cy.visit(url, options) cy.visit(options) 使 ...

  4. NetCore的Docker部署

    NetCore的Docker部署 一.NetCore与Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或 ...

  5. java基础(2):注释、关键字、标识符、数据

    1. 注释.关键字与标识符 大家可以安装一个文本编辑软件notepad++,有利于java代码的查看与编写. 1.1 程序注释 通常我们需要在源代码中添加文字用来对进行代码解释说明,但这些文字并不是J ...

  6. 推荐一个Emoji框架

    表情的需求很常见.有的可以看看,没有的可以先收藏以备不时之需. 这个框架的反应速度很快,界面简洁漂亮,功能完备. 而且代码简洁易懂,便于学习. GitHub:https://github.com/ne ...

  7. EXPDP导数报ORA-00942案例

    使用数据泵(expdp)导数时遇到了ORA-31626 & ORA-00942 错误,数据库版本为Oracle Database 10g Release 10.2.0.5.0,具体错误如下所示 ...

  8. 爬取编程常用词汇,保存为Excel

    编程常用词汇 import requests import openpyxl from lxml import etree import re url = 'https://www.runoob.co ...

  9. 机器学习--用PCA算法实现三维样本降到二维

    对于维数比较多的数据,首先需要做的事就是在尽量保证数据本质的前提下将数据中的维数降低.降维是一种数据集预处理技术,往往在数据应用在其他算法之前使用,它可以去除掉数据的一些冗余信息和噪声,使数据变得更加 ...

  10. eclispe git config配置文件配置远程仓库

    git config基本配置如下: [core] repositoryformatversion = 0 filemode = false logallrefupdates = true [remot ...