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. HDU - 5952 Counting Cliques

    Counting Cliques HDU - 5952 OJ-ID: hdu-5952 author:Caution_X date of submission:20191110 tags:dfs,gr ...

  2. go语言的常量

    Go 语言常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifier ...

  3. 案例:使用dbms_xplan.display_cursor无法获取执行计划

    案例:使用dbms_xplan.display_cursor无法获取执行计划 环境:RHEL 6.5 + Oracle 11.2.0.4 在一次测试中发现使用dbms_xplan.display_cu ...

  4. 【ASP.NET Core学习】入门

    下面操作都是基于VS Code,Net Core3.0 创建 Web 应用项目  VS Code终端输入 dotnet new webapp -o aspnetcoreapp 创建一个名称为aspne ...

  5. Git - Git本地仓库与GitHub远程仓库关联

    前言 Git本地仓库与GitHub仓库的关联逻辑如下 创建Key 在本地仓库下,新建Key文件夹,然后打开Key文件夹,单击鼠标右键,选择Git Bash Here. 输入命令:ssh-keygen ...

  6. Nginx web基础入门

    目录 Nginx web基础入门 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 日志格式 game日志记录实战 日志切割 手写虚拟 ...

  7. C#&.Net干货分享-构建后台自动定时任务的源码

    1.创建一个自动处理中心任务参数的类,直接源码: namespace Frame.AutoProcess{    /// <summary>    /// 委托(用于异步处理任务)    ...

  8. mssql sqlserver text、image字段类型无法使用DISTINCT的处理方法分享

    转自: http://www.maomao365.com/?p=9775  摘要: 下文简述sqlserver数据库中 text image类型无法使用distinct的处理方法分享 实验环境:sql ...

  9. 安装 tensorflow 1.1.0;以及安装其他相似版本tensorflow遇到的问题;tensorflow 1.13.2 cuda-10环境变量配置问题;Tensorflow 指定训练时如何指定使用的GPU;

    # 安装 2.7 环境conda create -n python2. python= conda activate python2. # 安装 1.1.0 gpu版本pip # 配置环境变量expo ...

  10. hdu6521 吉司机线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=6521 待填 代码 #include<bits/stdc++.h> #define ls o<& ...