Form表单的功能

  • 自动生成HTML表单元素
  • 检查表单数据的合法性
  • 如果验证错误,重新显示表单(数据不会重置)
  • 数据类型转换(字符类型的数据转换成相应的Python类型)

1、创建Form类

  1. from django.forms import Form
  2. from django.forms import widgets
  3. from django.forms import fields
  4.  
  5. class MyForm(Form):
  6. user = fields.CharField(
  7. widget=widgets.TextInput(attrs={'id': 'i1', 'class': 'c1'})
  8. )
  9.  
  10. gender = fields.ChoiceField(
  11. choices=((1, '男'), (2, '女'),),
  12. initial=2,
  13. widget=widgets.RadioSelect
  14. )
  15.  
  16. city = fields.CharField(
  17. initial=2,
  18. widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
  19. )
  20.  
  21. pwd = fields.CharField(
  22. widget=widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True)
  23. )

2、View函数处理

  1. from django.shortcuts import render, redirect
  2. from .forms import MyForm
  3.  
  4. def index(request):
  5. if request.method == "GET":
  6. obj = MyForm()
  7. return render(request, 'index.html', {'form': obj})
  8. elif request.method == "POST":
  9. obj = MyForm(request.POST, request.FILES)
  10. if obj.is_valid():
  11. values = obj.clean()
           print(obj.cleaned_data)
  12. print(values)
  13. else:
  14. errors = obj.errors
  15. print(errors.as_json)
  16. return render(request, 'index.html', {'form': obj})
  17. else:
  18. return redirect('http://www.google.com')

3.生成HTML

  1. <form method="POST" enctype="multipart/form-data">
  2. {% csrf_token %}
  3.  
  4. {{ form.xxoo.label }}
  5. {{ form.xxoo.id_for_label }}
  6. {{ form.xxoo.label_tag }}
  7. {{ form.xxoo.errors }}
  8. <p>{{ form.user }} {{ form.user.errors }}</p>
  9. <input type="submit" />
  10. </form>

  

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

1、Django内置字段如下:

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

  

内置插件:

  1. TextInput(Input)
  2. NumberInput(TextInput)
  3. EmailInput(TextInput)
  4. URLInput(TextInput)
  5. PasswordInput(TextInput)
  6. HiddenInput(TextInput)
  7. Textarea(Widget)
  8. DateInput(DateTimeBaseInput)
  9. DateTimeInput(DateTimeBaseInput)
  10. TimeInput(DateTimeBaseInput)
  11. CheckboxInput
  12. Select
  13. NullBooleanSelect
  14. SelectMultiple
  15. RadioSelect
  16. CheckboxSelectMultiple
  17. FileInput
  18. ClearableFileInput
  19. MultipleHiddenInput
  20. SplitDateTimeWidget
  21. SplitHiddenDateTimeWidget
  22. SelectDateWidget

  

常用选择插件

  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. # )

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

  1. 方式一:
  2. from django.forms import Form
  3. from django.forms import widgets
  4. from django.forms import fields
  5. from django.core.validators import RegexValidator
  6.  
  7. class MyForm(Form):
  8.  
  9. user = fields.ChoiceField(
  10. # choices=((1, '上海'), (2, '北京'),),
  11. initial=2,
  12. widget=widgets.Select
  13. )
  14.  
  15. def __init__(self, *args, **kwargs):
  16. super(MyForm,self).__init__(*args, **kwargs)
  17. # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
  18. # 或
  19. self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')
  20.  
  21. 方式二:使用django提供的ModelChoiceFieldModelMultipleChoiceField字段来实现
  22.  
  23. from django import forms
  24. from django.forms import fields
  25. from django.forms import widgets
  26. from django.forms import models as form_model
  27. from django.core.exceptions import ValidationError
  28. from django.core.validators import RegexValidator
  29.  
  30. class FInfo(forms.Form):
  31. authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
  32. # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

  

自定义验证规则

  1. 方式一:
  2. from django.forms import Form
  3. from django.forms import widgets
  4. from django.forms import fields
  5. from django.core.validators import RegexValidator
  6.  
  7. class MyForm(Form):
  8. user = fields.CharField(
  9. validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
  10. )
  11.  
  12. 方式二:
  13. import re
  14. from django.forms import Form
  15. from django.forms import widgets
  16. from django.forms import fields
  17. from django.core.exceptions import ValidationError
  18.  
  19. # 自定义验证规则
  20. def mobile_validate(value):
  21. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  22. if not mobile_re.match(value):
  23. raise ValidationError('手机号码格式错误')
  24.  
  25. class PublishForm(Form):
  26.  
  27. title = fields.CharField(max_length=20,
  28. min_length=5,
  29. error_messages={'required': '标题不能为空',
  30. 'min_length': '标题最少为5个字符',
  31. 'max_length': '标题最多为20个字符'},
  32. widget=widgets.TextInput(attrs={'class': "form-control",
  33. 'placeholder': '标题5-20个字符'}))
  34.  
  35. # 使用自定义验证规则
  36. phone = fields.CharField(validators=[mobile_validate, ],
  37. error_messages={'required': '手机不能为空'},
  38. widget=widgets.TextInput(attrs={'class': "form-control",
  39. 'placeholder': u'手机号码'}))
  40.  
  41. email = fields.EmailField(required=False,
  42. error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},
  43. widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))
  44.  
  45. 方式三:自定义方法
  46.  
  47. from django import forms
  48. from django.forms import fields
  49. from django.forms import widgets
  50. from django.core.exceptions import ValidationError
  51. from django.core.validators import RegexValidator
  52.  
  53. class FInfo(forms.Form):
  54. username = fields.CharField(max_length=5,
  55. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.', 'invalid')], )
  56. email = fields.EmailField()
  57.  
  58. def clean_username(self):
  59. """
  60. Form中字段中定义的格式匹配完之后,执行此方法进行验证
  61. :return:
  62. """
  63. value = self.cleaned_data['username']
  64. if "666" in value:
  65. raise ValidationError('666已经被玩烂了...', 'invalid')
  66. return value
  67.  
  68. 方式四:同时生成多个标签进行验证
  69.  
  70. from django.forms import Form
  71. from django.forms import widgets
  72. from django.forms import fields
  73.  
  74. from django.core.validators import RegexValidator
  75.  
  76. ############## 自定义字段 ##############
  77. class PhoneField(fields.MultiValueField):
  78. def __init__(self, *args, **kwargs):
  79. # Define one message for all fields.
  80. error_messages = {
  81. 'incomplete': 'Enter a country calling code and a phone number.',
  82. }
  83. # Or define a different message for each field.
  84. f = (
  85. fields.CharField(
  86. error_messages={'incomplete': 'Enter a country calling code.'},
  87. validators=[
  88. RegexValidator(r'^[0-9]+$', 'Enter a valid country calling code.'),
  89. ],
  90. ),
  91. fields.CharField(
  92. error_messages={'incomplete': 'Enter a phone number.'},
  93. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid phone number.')],
  94. ),
  95. fields.CharField(
  96. validators=[RegexValidator(r'^[0-9]+$', 'Enter a valid extension.')],
  97. required=False,
  98. ),
  99. )
  100. super(PhoneField, self).__init__(error_messages=error_messages, fields=f, require_all_fields=False, *args,
  101. **kwargs)
  102.  
  103. def compress(self, data_list):
  104. """
  105. 当用户验证都通过后,该值返回给用户
  106. :param data_list:
  107. :return:
  108. """
  109. return data_list
  110.  
  111. ############## 自定义插件 ##############
  112. class SplitPhoneWidget(widgets.MultiWidget):
  113. def __init__(self):
  114. ws = (
  115. widgets.TextInput(),
  116. widgets.TextInput(),
  117. widgets.TextInput(),
  118. )
  119. super(SplitPhoneWidget, self).__init__(ws)
  120.  
  121. def decompress(self, value):
  122. """
  123. 处理初始值,当初始值initial不是列表时,调用该方法
  124. :param value:
  125. :return:
  126. """
  127. if value:
  128. return value.split(',')
  129. return [None, None, None]

  

初始化数据

在Web应用程序中开发编写功能时,时常用到获取数据库中的数据并将值初始化在HTML中的标签上。

1、Form

  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.  
  9. city = fields.ChoiceField(
  10. choices=((1, '上海'), (2, '北京'),),
  11. widget=widgets.Select
  12. )

  

2、Views

  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')

  

3、HTML

  1. <form method="POST" enctype="multipart/form-data">
  2. {% csrf_token %}
  3. <p>{{ form.user }} {{ form.user.errors }}</p>
  4. <p>{{ form.city }} {{ form.city.errors }}</p>
  5.  
  6. <input type="submit"/>
  7. </form>

  

Django之forms表单类的更多相关文章

  1. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  2. Django forms表单 select下拉框的传值

    今儿继续做项目,学习了Django的forms生成前端的代码. forms.py class SignupForm(forms.Form): username = forms.CharField(va ...

  3. django之表单类

    一:表单类 一般我们在html中自己写的表单类似于下面的样子 <!DOCTYPE html> <html lang="en"> <head> & ...

  4. django实现密码加密的注册(数据对象插入)-结合forms表单实现表单验证

    forms表单 #_*_coding:utf-8_*_ from django import forms class regis(forms.Form): username = forms.CharF ...

  5. Django的form表单

    html的form表单 django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单. 例如: # form2/urls.py from django.contrib ...

  6. 页面注册系统--使用forms表单结合ajax

    页面注册系统--使用forms表单结合ajax 在Django中通过forms构建一个表单 1.urls.py 配置路由 from django.conf.urls import url from d ...

  7. django 【form表单】

    #########################根据类来生成表单################# ''' django form类 通模型类的属性映射到数据库的字段一样,表单类的字段会映射到HTM ...

  8. Django使用普通表单、Form、以及modelForm操作数据库方式总结

    Django使用普通表单.Form.以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样: 进入填写表单页面: 在表单页面填写信息,并提交: 表单数据验证 验证 ...

  9. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

随机推荐

  1. vue2搭建简易spa

    使用vue-cli来配置webpack,webpack是一个打包工具,使程序模块化 全局安装vue-cli: npm install -g vue-cli 安装好后,使用vue-cli脚手架配置web ...

  2. wsl折腾记

    参考1 wsl在哪 C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndg ...

  3. 【winform】基于UserControl实现webBrower组件时html页面元素加载及onclick事件监听实现

    [背景]基于System.Windows.Forms.UserControl实现的webBrower组件在html内使用window.external调用winform事件失败. [解决思路]借助wi ...

  4. linux安全机制学习【转】

    转自:http://blog.csdn.net/qq_20307987/article/details/51307820 曾经一度想学来着,今天看到一个链接,讲的很好,算是写一下加深印象吧 1 栈溢出 ...

  5. LVS高可用集群的配置

    网络结构: LVS DR工作原理 LVS集群从客户端上看可以将整个集群看成单个服务器对外提供服务,其IP是集群内部的VIP(虚拟IP).从内部看,转发服务器(DS)其实并没有启动应用层的服务对接口进行 ...

  6. 【linux高级程序设计】(第七章)终端及串口编程 未完成

    一.端口设备类型 1.显示设备基本信息 cat /proc/tty/drivers 里面包括了: 当前终端:/dev/tty 前台控制台终端:/dev/console 用于创建虚拟终端的:/dev/p ...

  7. yii框架美化访问路径,去掉index.php/?r=部分

    一.找到配置文件(ps:advance高级模板) 在工程目录-> backend目录 或 frontend目录 -> config目录 -> main.php文件 -> 在 r ...

  8. Dialog和软键盘在屏幕上的并存问题:

    最近做添加门店,门店昵称自动根据文字变化去搜索后台数据,但是一搜索软键盘就关闭了,感觉用户体验不太好.一开始根本不知道啥问题,找了半天才发现是网络请求dialog加载导致软件盘隐藏的,后面直接把dia ...

  9. MapReduce1 工作机制

    本文转自:Hadoop MapReduce 工作机制 工作流程 作业配置 作业提交 作业初始化 作业分配 作业执行 进度和状态更新 作业完成 错误处理 作业调度 shule(mapreduce核心)和 ...

  10. dedecms跳转标签

    我们在使用织梦dedecms制作网站的时候,有时会遇到利用arclist和list标签调用redirecturl属性.但是,dedecms的arclist和list标签不支持redirecturl.很 ...