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. Java学习 1.4——第一个Java程序:Hello World!

    这一篇一起来写第一个Java程序,同时也了解一下IDEA的使用: 打开IDEA,新建项目: 选择Java,右边project SDK是选择Java版本,上一篇我们自己安装了JDK1.8,IDEA自带一 ...

  2. centOS极简安装并启动ngnix

    我在网上看到过很多种方法在centOS中安装nginx,比如像这样的: 这种方式太麻烦了,看了很恶心. 我在官网看到有这样一种操作,可谓极简.特此记录一下:(官网教程地址:http://nginx.o ...

  3. Linux 释放cache

    sysc 将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node.已延迟的块 I/O 和读写映射文件 echo 3 > /proc/sys/vm/drop_caches To free p ...

  4. Thymeleaf常用语法:使用星号表达式

    在处理模板时,一般情况都是使用变量表达式 ${...} 来显示变量,还可以使用选定对象表达式 *{...},它也称为星号表达式.如果在模板中先选定了对象,则需要使用星号表达式.Thymeleaf的内置 ...

  5. P1005 Spell It Right

    # P1005 Spell It Right 原题 Given a non-negative integer N, your task is to compute the sum of all the ...

  6. SQL Server如何查看存储过程的执行计划

    有时候,我们需要查看存储过程的执行计划,那么我们有什么方式获取存储过程的历史执行计划或当前的执行计划呢? 下面总结一下获取存储过程的执行计划的方法. 1:我们可以通过下面脚本查看存储过程的执行计划,但 ...

  7. Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑(二)

    django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...

  8. Linux使用BIND提供域名解析服务

    DNS(Domain Name System,域名系统)用于管理和解析域名与IP地址对应关系的技术. 主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系. 从服务器:从主 ...

  9. bps和pps

    bps,比特率指的是每秒传输比特数 在实际所说的1M带宽的意思是1Mbps(是兆比特每秒Mbps不是兆字节每秒MBps) pps(数据包每秒),常用的网络吞吐率的单位(即每秒发送多少个分组数据包),网 ...

  10. Druid-代码段-1-5

    所属文章:池化技术(一)Druid是如何管理数据库连接的? 本代码段对应流程1.4,抛弃连接: //丢弃连接 public void discardConnection(Connection real ...