Form是Django的功能较强的验证组件,负责各种表单验证

  1. input中的name属性值要和form中的字段名相同
  2. from django import forms
  3. from django.forms import fields
  4. class LoginForm(forms.Form):
  5. email = fields.EmailField()
  6. user = fields.CharField()
  7. pwd = fields.CharField()
  8. type = fields.ChoiceField(
  9. choices = models.UserType.object.values_list('id','caption')
  10. )
  11.  
  12. def __init__(self,*args,**kwargs):
  13. super(LoginForm,self).__init__(*args,**kwargs)
  14. self.fields['type'].choices = models.UserType.object.values_list('id','caption')
  1. 错误信息自定制和验证参数
  1. email = fields.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'})
  2. pwd = forms.CharField(
  3. max_length=12,
  4. min_length=6,
  5. error_messages={'min_length':'密码长度不能小于6','max_length':'密码长度不能大于12'
  6. )

views函数使用form验证

  1. def login(request):
  2. obj = LoginForm(request.POST)
  3. res = obj.is_valid()
  4. if res:
  5. print(obj.cleaned_data)
  6. models.UserInfo.object.create(**obj.cleaned_data)
  7. #models.UserInfo.object.filter(id='1').update(**obj.cleaned_data)
  8. else:
  9. print(obj.errors)
  10. print(obj.errors.as_json())
  11. #obj.errors继承ErrorDict --> super Dict
  12. print(obj.errors['user'])
  13. print(obj.errors['user'][0]) #user第一个错误信息
  14.  
  15. - is_valid -> 每一个字段进行正则(字段内置正则)+clean_字段 -> clean(__all__) -> _post_clean
  16. - cleaned_data 正确信息
  17. - error 错误信息

使用Forms自动生成标签

  1. get的时候要创建Form对象obj,并传递到前端
  2. 并且和post处理的创建的Form对象名要一致,后台验证返回处理结果后,前端还保留原来用户输入的值
  3. 1.<form>
  4. {{obj.user}} {{obj.errors.user.0}}
  5. {{obj.pwd}} {{obj.errors.user.0}}
  6. {{obj.email}} {{obj.errors.user.0}}
  7. </form>
  8. 2.<form>
  9. {{obj.as_p}}
  10. </form>
  11. 3.<form>
  12. {{obj.as_ul}}
  13. </form>
  14. 4.<form>
  15. <table>
  16. {{obj.as_table}}
  17. </table>
  18. </form>

Form样式设置

  1. xxxField 只有验证功能,不能加样式,需要插件 widgets
           from django.forms import fields
  2. from django.forms import widgets
  3. email = fields.EmailField(
  4. error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'},
  5. widget=widget.Textarea(attrs={'class':'c1'...}),
  6. )

Django内置字段

  1. Field
  2. required=True, 是否允许为空
  3. widget=None, HTML插件
  4. label=None, 用于生成Label标签或显示内容
  5. {{obj.user.lable}}
  6. initial=None, 初始值
  7. help_text='', 帮助信息(在标签旁边显示)
  8. error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
  9. show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
  10. validators=[], 自定义验证规则
  11. localize=False, 是否支持本地化
  12. #这里使用本地时间,默认使用UTC时间
  13. disabled=False, 是否可以编辑
  14. label_suffix=None Label内容后缀
  15.  
  16. CharField(Field)
  17. max_length=None, 最大长度
  18. min_length=None, 最小长度
  19. strip=True 是否移除用户输入空白
  20.  
  21. IntegerField(Field)
  22. max_value=None, 最大值
  23. min_value=None, 最小值
  24.  
  25. FloatField(IntegerField)
  26. ...
  27.  
  28. DecimalField(IntegerField)
  29. max_value=None, 最大值
  30. min_value=None, 最小值
  31. max_digits=None, 总长度
  32. decimal_places=None, 小数位长度
  33.  
  34. BaseTemporalField(Field)
  35. input_formats=None 时间格式化
  36.  
  37. DateField(BaseTemporalField) 格式:2015-09-01
  38. TimeField(BaseTemporalField) 格式:11:12
  39. DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
  40.  
  41. DurationField(Field) 时间间隔:%d %H:%M:%S.%f
  42. ...
  43.  
  44. RegexField(CharField)
  45. regex, 自定制正则表达式
  46. max_length=None, 最大长度
  47. min_length=None, 最小长度
  48. error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}
  49.  
  50. EmailField(CharField)
  51. ...
  52.  
  53. FileField(Field) ********
  54. allow_empty_file=False 是否允许空文件
  55.  
  56. ImageField(FileField)
  57. ...
  58. 注:需要PIL模块,pip3 install Pillow
  59. 以上两个字典使用时,需要注意两点:
  60. - form表单中 enctype="multipart/form-data"
  61. - view函数中 obj = MyForm(request.POST, request.FILES)
  62.  
  63. URLField(Field)
  64. ...
  65.  
  66. BooleanField(Field)
  67. ...
  68.  
  69. NullBooleanField(BooleanField)
  70. ...
  71.  
  72. ChoiceField(Field)*******
  73. ...
  74. choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),)
  75. required=True, 是否必填
  76. widget=None, 插件,默认select插件
  77. label=None, Label内容
  78. initial=None, 初始值
  79. help_text='', 帮助提示
  80.  
  81. ModelChoiceField(ChoiceField)
  82. ... django.forms.models.ModelChoiceField
  83. queryset, # 查询数据库中的数据
  84. empty_label="---------", # 默认空显示内容
  85. to_field_name=None, # HTML中value的值对应的字段
  86. limit_choices_to=None # ModelForm中对queryset二次筛选
  87.  
  88. ModelMultipleChoiceField(ModelChoiceField)
  89. ... django.forms.models.ModelMultipleChoiceField
  90.  
  91. TypedChoiceField(ChoiceField)
  92. coerce = lambda val: val 对选中的值进行一次转换
  93. empty_value= '' 空值的默认值
  94.  
  95. MultipleChoiceField(ChoiceField)
  96. ...
  97.  
  98. TypedMultipleChoiceField(MultipleChoiceField)
  99. coerce = lambda val: val 对选中的每一个值进行一次转换
  100. empty_value= '' 空值的默认值
  101.  
  102. ComboField(Field)
  103. fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
  104. fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
  105.  
  106. MultiValueField(Field)
  107. PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
  108.  
  109. SplitDateTimeField(MultiValueField)
  110. input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
  111. input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
  112.  
  113. FilePathField(ChoiceField) 文件选项,目录下所有文件名显示在页面中
  114. path, 文件夹路径
  115. match=None, 正则匹配
  116. recursive=False, 递归下面的文件夹
  117. allow_files=True, 允许文件
  118. allow_folders=False, 允许文件夹
  119. required=True,
  120. widget=None,
  121. label=None,
  122. initial=None,
  123. help_text=''
  124.  
  125. GenericIPAddressField
  126. protocol='both', both,ipv4,ipv6支持的IP格式
  127. unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1 PSprotocol必须为both才能启用
  128.  
  129. SlugField(CharField) 数字,字母,下划线,减号(连字符)
  130. ...
  131.  
  132. UUIDField(CharField) uuid类型
  133. ...

常用插件

  1. # 单radio,值为字符串
  2. # user = fields.CharField(
  3. # initial=2,
  4. # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
  5. # )
  6.  
  7. # 单radio,值为字符串
  8. # user = fields.ChoiceField(
  9. # choices=((1, '上海'), (2, '北京'),),
  10. # initial=2,
  11. # widget=widgets.RadioSelect
  12. # )
  13.  
  14. # 单select,值为字符串
  15. # user = fields.CharField(
  16. # initial=2,
  17. # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
  18. # )
  19.  
  20. # 单select,值为字符串
  21. # user = fields.ChoiceField(
  22. # choices=((1, '上海'), (2, '北京'),),
  23. # initial=2,
  24. # widget=widgets.Select
  25. # )
  26.  
  27. # 多选select,值为列表
  28. # user = fields.MultipleChoiceField(
  29. # choices=((1,'上海'),(2,'北京'),),
  30. # initial=[1,],
  31. # widget=widgets.SelectMultiple
  32. # )
  33.  
  34. # 单checkbox
  35. # user = fields.CharField(
  36. # widget=widgets.CheckboxInput()
  37. # )
  38.  
  39. # 多选checkbox,值为列表
  40. # user = fields.MultipleChoiceField(
  41. # initial=[2, ],
  42. # choices=((1, '上海'), (2, '北京'),),
  43. # widget=widgets.CheckboxSelectMultiple
  44. # )

自定义验证规则

  方式一:

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4. from django.core.validators import RegexValidator
  5.  
  6. class MyForm(Form):
  7. user = fields.CharField(
  8. validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
  9. )

  方式二:

  1. import re
  2. from django.forms import Form
  3. from django.forms import widgets
  4. from django.forms import fields
  5. from django.core.exceptions import ValidationError
  6.  
  7. # 自定义验证规则
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class PublishForm(Form):
  14. title = fields.CharField(max_length=20,
  15. min_length=5,
  16. error_messages={'required': '标题不能为空',
  17. 'min_length': '标题最少为5个字符',
  18. 'max_length': '标题最多为20个字符'},
  19. widget=widgets.TextInput(attrs={'class': "form-control",
  20. 'placeholder': '标题5-20个字符'}))
  21.  
  22. # 使用自定义验证规则
  23. phone = fields.CharField(validators=[mobile_validate, ],
  24. error_messages={'required': '手机不能为空'},
  25. widget=widgets.TextInput(attrs={'class': "form-control",
  26. 'placeholder': u'手机号码'}))
  27.  
  28. email = fields.EmailField(required=False,
  29. error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
  30. widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

  方式三:

  1. from django import forms
  2. from django.forms import fields
  3. from django.forms import widgets
  4. from django.core.exceptions import ValidationError
  5. from django.core.validators import RegexValidator
  6.  
  7. class FInfo(forms.Form):
  8. username = fields.CharField(max_length=5,
  9. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
  10. email = fields.EmailField()
  11.  
  12. def clean_username(self):
  13. """
  14. Form中字段中定义的格式匹配完之后,执行此方法进行验证
  15. :return:
  16. """
  17. value = self.cleaned_data['username']
  18. if "" in value:
  19. raise ValidationError('666已经被玩烂了...', 'invalid')
  20. return value

  方式四:

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4.  
  5. from django.core.validators import RegexValidator
  6.  
  7. ############## 自定义字段 ##############
  8. class PhoneField(fields.MultiValueField):
  9. def __init__(self, *args, **kwargs):
  10. # Define one message for all fields.
  11. error_messages = {
  12. 'incomplete': 'Enter a country calling code and a phone number.',
  13. }
  14. # Or define a different message for each field.
  15. f = (
  16. fields.CharField(
  17. error_messages={'incomplete': 'Enter a country calling code.'},
  18. validators=[
  19. RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
  20. ],
  21. ),
  22. fields.CharField(
  23. error_messages={'incomplete': 'Enter a phone number.'},
  24. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
  25. ),
  26. fields.CharField(
  27. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
  28. required=False,
  29. ),
  30. )
  31. super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
  32. **kwargs)
  33.  
  34. def compress(self, data_list):
  35. """
  36. 当用户验证都通过后,该值返回给用户
  37. :param data_list:
  38. :return:
  39. """
  40. return data_list
  41.  
  42. ############## 自定义插件 ##############
  43. class SplitPhoneWidget(widgets.MultiWidget):
  44. def __init__(self):
  45. ws = (
  46. widgets.TextInput(),
  47. widgets.TextInput(),
  48. widgets.TextInput(),
  49. )
  50. super(SplitPhoneWidget, self).__init__(ws)
  51.  
  52. def decompress(self, value):
  53. """
  54. 处理初始值,当初始值initial不是列表时,调用该方法
  55. :param value:
  56. :return:
  57. """
  58. if value:
  59. return value.split(',')
  60. return [None, None, None]

数据初始化

  1. from django.shortcuts import render, redirect
  2. from .forms import MyForm
  3.  
  4. def index(request):
  5. if request.method == "GET":
  6. values = {'user': 'root', 'city': 2}
  7. obj = MyForm(values)
  8.  
  9. return render(request, 'index.html', {'form': obj})
  10. elif request.method == "POST":
  11. return redirect('http://www.google.com')
  12. else:
  13. return redirect('http://www.google.com')
  1. 对于form表单生生成来说,如果表单过大,每次发送表单的时间就非常久。
    如果遇到大文件的上传会影响到页面的刷新速度,一般文件上传会和表单上传拆开,
    只要选中上传的文件,文件就会偷偷的发送到后台,不用和表单一并发送。

Django学习-22-Form的更多相关文章

  1. Django学习之Form表单

    一.Form介绍 普通方式手写注册功能 使用form组件实现注册功能 二.Form那些事儿 1.常用字段与插件 initial error_messages password radioSelect ...

  2. Django学习手册 - Form 插件

    """ 核心: from django import formsfrom django.forms import fieldsfrom django.forms impo ...

  3. django学习之- Form

    参考:http://www.cnblogs.com/wupeiqi/articles/6144178.htmlFORM中的字段只对post上来的数据进行form验证,主要涉及:字段 和 插件字段:对用 ...

  4. django学习-22.admi管理后台页面的文案展示等相关配置

    目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...

  5. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  6. Django学习笔记(14)——AJAX与Form组件知识补充(局部钩子和全局钩子详解)

    我在之前做了一个关于AJAX和form组件的笔记,可以参考:Django学习笔记(8)——前后台数据交互实战(AJAX):Django学习笔记(6)——Form表单 我觉得自己在写Django笔记(8 ...

  7. python 学习笔记十七 django深入学习二 form,models

    表单 GET 和 POST 处理表单时候只会用到GET 和 POST 方法. Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据.对它们进行编码以用于传输.将它们发送到服务器然 ...

  8. Django学习之八:forms组件【对form舒心了】

    目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...

  9. Django学习---Form组件认证

    Form组件认证 能够帮助我们做用户认证. 以前写我们自己写用户认证的时候,我们自己写HTML的form表单,点击提交,数据就被发送到后台,后台进行验证.在验证过程中我们就需要自己去写正则表达式去匹配 ...

  10. Django学习笔记之Django Form表单

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

随机推荐

  1. Effective Java 第三版——31.使用限定通配符来增加API的灵活性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. Kakfa消息投递语义

    Message Delivery Semantics At most once -- Messages may be lost but are never redelivered(消息可能丢失但不会重 ...

  3. Oracle的一些简单语句

    drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 1.通过查询回收站user_recyclebin获取被删除的表信息, ...

  4. CodeChef Little Elephant and Mouses [DP]

    https://www.codechef.com/problems/LEMOUSE 题意: 有一个n *m的网格.有一头大象,初始时在(1,1),要移动到(n,m),每次只能向右或者向下走.有些格子中 ...

  5. Angular Pipe的应用

    1-在html文件中使用管道:(管道符合使用,用':'号隔开) ①页面中添加: <div class="table_content" *ngFor="let ite ...

  6. Function与Object的关系

    这里先简单介绍一下我研究这个问题的初衷.起初我只是想研究一下原型链的基本思想.构造函数拥有prototype属性,指向它的prototype,而该构造函数的实例化对象则拥有一个[[prototype] ...

  7. elasticsearch2.3.3安装

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 作者原来搭建的环境是0.95版本 现在升级到2.3.3版本, ...

  8. curl模拟post和get请求

    function _post($url,$post_data){     $ch = curl_init();     curl_setopt($ch, CURLOPT_URL, $url);     ...

  9. C/C++语言简介之语言组成

    一.数据类型 C的数据类型包括:整型.字符型.实型或浮点型(单精度和双精度).枚举类型.数组类型.结构体类型.共用体类型.指针类型和空类型. 二.常量与变量 常量其值不可改变,符号常量名通常用大写. ...

  10. solr6.6教程-基础环境搭建(二)

    在上一篇文章中已经简单介绍了solr在windows的部署,今天我们来下如何新建一个自己core. 1,core理解 如果把solr理解为个数据库的话,那么core可以理解为数据库中的一张表,其实就是 ...