Django学习-22-Form
Form是Django的功能较强的验证组件,负责各种表单验证
- input中的name属性值要和form中的字段名相同
- from django import forms
- from django.forms import fields
- class LoginForm(forms.Form):
- email = fields.EmailField()
- user = fields.CharField()
- pwd = fields.CharField()
- type = fields.ChoiceField(
- choices = models.UserType.object.values_list('id','caption')
- )
- def __init__(self,*args,**kwargs):
- super(LoginForm,self).__init__(*args,**kwargs)
- self.fields['type'].choices = models.UserType.object.values_list('id','caption')
- 错误信息自定制和验证参数
- email = fields.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})
- pwd = forms.CharField(
- max_length=12,
- min_length=6,
- error_messages={'min_length':'密码长度不能小于6','max_length':'密码长度不能大于12'
- )
views函数使用form验证
- def login(request):
- obj = LoginForm(request.POST)
- res = obj.is_valid()
- if res:
- print(obj.cleaned_data)
- models.UserInfo.object.create(**obj.cleaned_data)
- #models.UserInfo.object.filter(id='1').update(**obj.cleaned_data)
- else:
- print(obj.errors)
- print(obj.errors.as_json())
- #obj.errors继承ErrorDict --> super Dict
- print(obj.errors['user'])
- print(obj.errors['user'][0]) #user第一个错误信息
- - is_valid -> 每一个字段进行正则(字段内置正则)+clean_字段 -> clean(__all__) -> _post_clean
- - cleaned_data 正确信息
- - error 错误信息
使用Forms自动生成标签
- get的时候要创建Form对象obj,并传递到前端
- 并且和post处理的创建的Form对象名要一致,后台验证返回处理结果后,前端还保留原来用户输入的值
- 1.<form>
- {{obj.user}} {{obj.errors.user.0}}
- {{obj.pwd}} {{obj.errors.user.0}}
- {{obj.email}} {{obj.errors.user.0}}
- </form>
- 2.<form>
- {{obj.as_p}}
- </form>
- 3.<form>
- {{obj.as_ul}}
- </form>
- 4.<form>
- <table>
- {{obj.as_table}}
- </table>
- </form>
Form样式设置
- xxxField 只有验证功能,不能加样式,需要插件 widgets
from django.forms import fields- from django.forms import widgets
- email = fields.EmailField(
- error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'},
- widget=widget.Textarea(attrs={'class':'c1'...}),
- )
Django内置字段
- Field
- required=True, 是否允许为空
- widget=None, HTML插件
- label=None, 用于生成Label标签或显示内容
- {{obj.user.lable}}
- initial=None, 初始值
- help_text='', 帮助信息(在标签旁边显示)
- error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
- show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
- validators=[], 自定义验证规则
- localize=False, 是否支持本地化
- #这里使用本地时间,默认使用UTC时间
- disabled=False, 是否可以编辑
- label_suffix=None Label内容后缀
- CharField(Field)
- max_length=None, 最大长度
- min_length=None, 最小长度
- strip=True 是否移除用户输入空白
- IntegerField(Field)
- max_value=None, 最大值
- min_value=None, 最小值
- FloatField(IntegerField)
- ...
- DecimalField(IntegerField)
- max_value=None, 最大值
- min_value=None, 最小值
- max_digits=None, 总长度
- decimal_places=None, 小数位长度
- BaseTemporalField(Field)
- input_formats=None 时间格式化
- DateField(BaseTemporalField) 格式:2015-09-01
- TimeField(BaseTemporalField) 格式:11:12
- DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
- DurationField(Field) 时间间隔:%d %H:%M:%S.%f
- ...
- RegexField(CharField)
- regex, 自定制正则表达式
- max_length=None, 最大长度
- min_length=None, 最小长度
- error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}
- EmailField(CharField)
- ...
- FileField(Field) ********
- allow_empty_file=False 是否允许空文件
- ImageField(FileField)
- ...
- 注:需要PIL模块,pip3 install Pillow
- 以上两个字典使用时,需要注意两点:
- - form表单中 enctype="multipart/form-data"
- - view函数中 obj = MyForm(request.POST, request.FILES)
- URLField(Field)
- ...
- BooleanField(Field)
- ...
- NullBooleanField(BooleanField)
- ...
- ChoiceField(Field)*******
- ...
- choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),)
- required=True, 是否必填
- widget=None, 插件,默认select插件
- label=None, Label内容
- initial=None, 初始值
- help_text='', 帮助提示
- ModelChoiceField(ChoiceField)
- ... django.forms.models.ModelChoiceField
- queryset, # 查询数据库中的数据
- empty_label="---------", # 默认空显示内容
- to_field_name=None, # HTML中value的值对应的字段
- limit_choices_to=None # ModelForm中对queryset二次筛选
- ModelMultipleChoiceField(ModelChoiceField)
- ... django.forms.models.ModelMultipleChoiceField
- TypedChoiceField(ChoiceField)
- coerce = lambda val: val 对选中的值进行一次转换
- empty_value= '' 空值的默认值
- MultipleChoiceField(ChoiceField)
- ...
- TypedMultipleChoiceField(MultipleChoiceField)
- coerce = lambda val: val 对选中的每一个值进行一次转换
- empty_value= '' 空值的默认值
- ComboField(Field)
- fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
- fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
- MultiValueField(Field)
- PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
- SplitDateTimeField(MultiValueField)
- input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
- input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
- FilePathField(ChoiceField) 文件选项,目录下所有文件名显示在页面中
- path, 文件夹路径
- match=None, 正则匹配
- recursive=False, 递归下面的文件夹
- allow_files=True, 允许文件
- allow_folders=False, 允许文件夹
- required=True,
- widget=None,
- label=None,
- initial=None,
- help_text=''
- GenericIPAddressField
- protocol='both', both,ipv4,ipv6支持的IP格式
- unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
- SlugField(CharField) 数字,字母,下划线,减号(连字符)
- ...
- UUIDField(CharField) uuid类型
- ...
常用插件
- # 单radio,值为字符串
- # user = fields.CharField(
- # initial=2,
- # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
- # )
- # 单radio,值为字符串
- # user = fields.ChoiceField(
- # choices=((1, '上海'), (2, '北京'),),
- # initial=2,
- # widget=widgets.RadioSelect
- # )
- # 单select,值为字符串
- # user = fields.CharField(
- # initial=2,
- # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
- # )
- # 单select,值为字符串
- # user = fields.ChoiceField(
- # choices=((1, '上海'), (2, '北京'),),
- # initial=2,
- # widget=widgets.Select
- # )
- # 多选select,值为列表
- # user = fields.MultipleChoiceField(
- # choices=((1,'上海'),(2,'北京'),),
- # initial=[1,],
- # widget=widgets.SelectMultiple
- # )
- # 单checkbox
- # user = fields.CharField(
- # widget=widgets.CheckboxInput()
- # )
- # 多选checkbox,值为列表
- # user = fields.MultipleChoiceField(
- # initial=[2, ],
- # choices=((1, '上海'), (2, '北京'),),
- # widget=widgets.CheckboxSelectMultiple
- # )
自定义验证规则
方式一:
- from django.forms import Form
- from django.forms import widgets
- from django.forms import fields
- from django.core.validators import RegexValidator
- class MyForm(Form):
- user = fields.CharField(
- validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
- )
方式二:
- import re
- from django.forms import Form
- from django.forms import widgets
- from django.forms import fields
- from django.core.exceptions import ValidationError
- # 自定义验证规则
- def mobile_validate(value):
- mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
- if not mobile_re.match(value):
- raise ValidationError('手机号码格式错误')
- class PublishForm(Form):
- title = fields.CharField(max_length=20,
- min_length=5,
- error_messages={'required': '标题不能为空',
- 'min_length': '标题最少为5个字符',
- 'max_length': '标题最多为20个字符'},
- widget=widgets.TextInput(attrs={'class': "form-control",
- 'placeholder': '标题5-20个字符'}))
- # 使用自定义验证规则
- phone = fields.CharField(validators=[mobile_validate, ],
- error_messages={'required': '手机不能为空'},
- widget=widgets.TextInput(attrs={'class': "form-control",
- 'placeholder': u'手机号码'}))
- email = fields.EmailField(required=False,
- error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
- widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
方式三:
- from django import forms
- from django.forms import fields
- from django.forms import widgets
- from django.core.exceptions import ValidationError
- from django.core.validators import RegexValidator
- class FInfo(forms.Form):
- username = fields.CharField(max_length=5,
- validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
- email = fields.EmailField()
- def clean_username(self):
- """
- Form中字段中定义的格式匹配完之后,执行此方法进行验证
- :return:
- """
- value = self.cleaned_data['username']
- if "" in value:
- raise ValidationError('666已经被玩烂了...', 'invalid')
- return value
方式四:
- from django.forms import Form
- from django.forms import widgets
- from django.forms import fields
- from django.core.validators import RegexValidator
- ############## 自定义字段 ##############
- class PhoneField(fields.MultiValueField):
- def __init__(self, *args, **kwargs):
- # Define one message for all fields.
- error_messages = {
- 'incomplete': 'Enter a country calling code and a phone number.',
- }
- # Or define a different message for each field.
- f = (
- fields.CharField(
- error_messages={'incomplete': 'Enter a country calling code.'},
- validators=[
- RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
- ],
- ),
- fields.CharField(
- error_messages={'incomplete': 'Enter a phone number.'},
- validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
- ),
- fields.CharField(
- validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
- required=False,
- ),
- )
- super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
- **kwargs)
- def compress(self, data_list):
- """
- 当用户验证都通过后,该值返回给用户
- :param data_list:
- :return:
- """
- return data_list
- ############## 自定义插件 ##############
- class SplitPhoneWidget(widgets.MultiWidget):
- def __init__(self):
- ws = (
- widgets.TextInput(),
- widgets.TextInput(),
- widgets.TextInput(),
- )
- super(SplitPhoneWidget, self).__init__(ws)
- def decompress(self, value):
- """
- 处理初始值,当初始值initial不是列表时,调用该方法
- :param value:
- :return:
- """
- if value:
- return value.split(',')
- return [None, None, None]
数据初始化
- from django.shortcuts import render, redirect
- from .forms import MyForm
- def index(request):
- if request.method == "GET":
- values = {'user': 'root', 'city': 2}
- obj = MyForm(values)
- return render(request, 'index.html', {'form': obj})
- elif request.method == "POST":
- return redirect('http://www.google.com')
- else:
- return redirect('http://www.google.com')
- 对于form表单生生成来说,如果表单过大,每次发送表单的时间就非常久。
如果遇到大文件的上传会影响到页面的刷新速度,一般文件上传会和表单上传拆开,
只要选中上传的文件,文件就会偷偷的发送到后台,不用和表单一并发送。
Django学习-22-Form的更多相关文章
- Django学习之Form表单
一.Form介绍 普通方式手写注册功能 使用form组件实现注册功能 二.Form那些事儿 1.常用字段与插件 initial error_messages password radioSelect ...
- Django学习手册 - Form 插件
""" 核心: from django import formsfrom django.forms import fieldsfrom django.forms impo ...
- django学习之- Form
参考:http://www.cnblogs.com/wupeiqi/articles/6144178.htmlFORM中的字段只对post上来的数据进行form验证,主要涉及:字段 和 插件字段:对用 ...
- django学习-22.admi管理后台页面的文案展示等相关配置
目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- Django学习笔记(14)——AJAX与Form组件知识补充(局部钩子和全局钩子详解)
我在之前做了一个关于AJAX和form组件的笔记,可以参考:Django学习笔记(8)——前后台数据交互实战(AJAX):Django学习笔记(6)——Form表单 我觉得自己在写Django笔记(8 ...
- python 学习笔记十七 django深入学习二 form,models
表单 GET 和 POST 处理表单时候只会用到GET 和 POST 方法. Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据.对它们进行编码以用于传输.将它们发送到服务器然 ...
- Django学习之八:forms组件【对form舒心了】
目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...
- Django学习---Form组件认证
Form组件认证 能够帮助我们做用户认证. 以前写我们自己写用户认证的时候,我们自己写HTML的form表单,点击提交,数据就被发送到后台,后台进行验证.在验证过程中我们就需要自己去写正则表达式去匹配 ...
- Django学习笔记之Django Form表单
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
随机推荐
- Effective Java 第三版——31.使用限定通配符来增加API的灵活性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Kakfa消息投递语义
Message Delivery Semantics At most once -- Messages may be lost but are never redelivered(消息可能丢失但不会重 ...
- Oracle的一些简单语句
drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 1.通过查询回收站user_recyclebin获取被删除的表信息, ...
- CodeChef Little Elephant and Mouses [DP]
https://www.codechef.com/problems/LEMOUSE 题意: 有一个n *m的网格.有一头大象,初始时在(1,1),要移动到(n,m),每次只能向右或者向下走.有些格子中 ...
- Angular Pipe的应用
1-在html文件中使用管道:(管道符合使用,用':'号隔开) ①页面中添加: <div class="table_content" *ngFor="let ite ...
- Function与Object的关系
这里先简单介绍一下我研究这个问题的初衷.起初我只是想研究一下原型链的基本思想.构造函数拥有prototype属性,指向它的prototype,而该构造函数的实例化对象则拥有一个[[prototype] ...
- elasticsearch2.3.3安装
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 作者原来搭建的环境是0.95版本 现在升级到2.3.3版本, ...
- curl模拟post和get请求
function _post($url,$post_data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); ...
- C/C++语言简介之语言组成
一.数据类型 C的数据类型包括:整型.字符型.实型或浮点型(单精度和双精度).枚举类型.数组类型.结构体类型.共用体类型.指针类型和空类型. 二.常量与变量 常量其值不可改变,符号常量名通常用大写. ...
- solr6.6教程-基础环境搭建(二)
在上一篇文章中已经简单介绍了solr在windows的部署,今天我们来下如何新建一个自己core. 1,core理解 如果把solr理解为个数据库的话,那么core可以理解为数据库中的一张表,其实就是 ...