Django的Forms组件主要有以下几大功能:

  • 页面初始化,生成HTML标签
  • 校验用户数据(显示错误信息)
  • HTML Form提交保留上次提交数据

一、小试牛刀

  1、定义Form类

  1. from django import forms
  2.  
  3. class EmpForm(forms.Form):
  4. name = forms.CharField(min_length=5, label="姓名", error_messages={"required": "该字段不能为空!",
  5. "min_length": "用户名太短。"})
  6. age = forms.IntegerField(label="年龄")
  7. salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资")

  2、设计url与视图对应关系

  1. from django.urls import path
  2. from app01 import views
  3.  
  4. urlpatterns = [
  5. path('add_emp/', views.add_emp),
  6. ]

  3、视图函数

  1. from app01.MyForms import EmpForm
  2.  
  3. def add_emp(request):
  4. if request.method == "GET":
  5. form = EmpForm() # 初始化form对象
  6. return render(request, "add_emp.html", {"form":form})
  7. else:
  8. form = EmpForm(request.POST) # 将数据传给form对象
  9. if form.is_valid(): # 进行校验
  10. data = form.cleaned_data # 校验通过的数据,字典
  11. print(data)
  12. models.Emp.objects.create(**data)
  13. return redirect("/index/")
  14. else: # 校验失败
  15. print(form.errors)
  16. return render(request, "add_emp.html", {"form": form})

  4、模板文件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8.  
  9. <h3>添加员工</h3>
  10.  
  11. {#1、自己手动写HTML页面#}
  12. {#<form action="" method="post">#}
  13. {# <p>姓名:<input type="text" name="name"></p>#}
  14. {# <p>年龄:<input type="text" name="age"></p>#}
  15. {# <p>工资:<input type="text" name="salary"></p>#}
  16. {# <input type="submit">#}
  17. {#</form>#}
  18.  
  19. {#2、通过form对象的as_p方法实现#}
  20. {#<form action="" method="post" novalidate>#}
  21. {# {% csrf_token %}#}
  22. {# {{ form.as_p }}#}
  23. {# <input type="submit">#}
  24. {#</form>#}
  25.  
  26. {#3、手动获取form对象的字段#}
  27. {#<form action="" method="post" novalidate>#}
  28. {# {% csrf_token %}#}
  29. {# <div>#}
  30. {# <label for="id_{{ form.name.name }}">姓名</label>#}
  31. {# {{ form.name }} <span>{{ form.name.errors.0 }}</span>#}
  32. {# </div>#}
  33. {# <div>#}
  34. {# <label for="id_{{ form.age.name }}">年龄</label>#}
  35. {# {{ form.age }} <span>{{ form.age.errors.0 }}</span>#}
  36. {# </div>#}
  37. {# <div>#}
  38. {# <label for="id_salary">工资</label>#}
  39. {# {{ form.salary }} <span>{{ form.salary.errors.0 }}</span>#}
  40. {# </div>#}
  41. {# <input type="submit">#}
  42. {#</form>#}
  43.  
  44. {#4、用for循环展示所有字段#}
  45. <form action="" method="post" novalidate>
  46. {% csrf_token %}
  47. {% for field in form %}
  48. <div>
  49. <label for="id_{{ field.name }}">{{ field.label }}</label>
  50. {{ field }} <span>{{ field.errors.0 }}</span>
  51. </div>
  52. {% endfor %}
  53. <input type="submit">
  54. </form>
  55.  
  56. </body>
  57. </html>

  附: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. ...

Django内置字段

二、局部钩子和全局钩子

  1、定义Form类

  1. from django import forms
  2. from django.core.exceptions import ValidationError
  3. from app01 import models
  4.  
  5. class EmpForm(forms.Form):
  6. name = forms.CharField(min_length=5, label="姓名", error_messages={"required": "该字段不能为空!",
  7. "min_length": "用户名太短。"})
  8. age = forms.IntegerField(label="年龄")
  9. salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资")
  10. r_salary = forms.DecimalField(max_digits=5, decimal_places=2, label="请再输入工资")
  11.  
  12. def clean_name(self): # 局部钩子
  13. val = self.cleaned_data.get("name")
  14.  
  15. if val.isdigit():
  16. raise ValidationError("用户名不能是纯数字")
  17. elif models.Emp.objects.filter(name=val):
  18. raise ValidationError("用户名已存在!")
  19. else:
  20. return val
  21.  
  22. def clean(self): # 全局钩子 确认两次输入的工资是否一致。
  23. val = self.cleaned_data.get("salary")
  24. r_val = self.cleaned_data.get("r_salary")
  25.  
  26. if val == r_val:
  27. return self.cleaned_data
  28. else:
  29. raise ValidationError("请确认工资是否一致。")

  2、视图函数

  1. def add_emp(request):
  2. if request.method == "GET":
  3. form = EmpForm() # 初始化form对象
  4. return render(request, "add_emp.html", {"form":form})
  5. else:
  6. form = EmpForm(request.POST) # 将数据传给form对象
  7. if form.is_valid(): # 进行校验
  8. data = form.cleaned_data
  9. data.pop("r_salary")
  10. models.Emp.objects.create(**data)
  11. return redirect("/index/")
  12. else: # 校验失败
  13. clear_errors = form.errors.get("__all__") # 获取全局钩子错误信息
  14. return render(request, "add_emp.html", {"form": form, "clear_errors": clear_errors})

  3、模板文件

  1. <form action="" method="post" novalidate>
  2. {% csrf_token %}
  3. <div>
  4. <label for="id_{{ form.name.name }}">姓名</label>
  5. {{ form.name }} <span>{{ form.name.errors.0 }}</span>
  6. </div>
  7. <div>
  8. <label for="id_{{ form.age.name }}">年龄</label>
  9. {{ form.age }} <span>{{ form.age.errors.0 }}</span>
  10. </div>
  11. <div>
  12. <label for="id_salary">工资</label>
  13. {{ form.salary }} <span>{{ form.salary.errors.0 }}{{ clear_errors.0 }}</span>
  14. </div>
  15. <div>
  16. <label for="id_r_salary">请再输入工资</label>
  17. {{ form.r_salary }} <span>{{ form.r_salary.errors.0 }}{{ clear_errors.0 }}</span>
  18. </div>
  19. <input type="submit">
  20. </form>

Django组件-Forms组件的更多相关文章

  1. django之forms组件

    在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...

  2. python 全栈开发,Day78(Django组件-forms组件)

    一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...

  3. django第13天(auth组件,forms组件,中间件,csrf)

    django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...

  4. 08 Django组件-Forms组件

    Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...

  5. Django组件--forms组件(注册用)

    一.forms组件--校验类的使用 二.form组件--校验类的参数 三.forms组件校验的局部钩子--自定义校验规则(要看源码理解) 四.forms组件校验的全局钩子--校验form表单两次密码输 ...

  6. web框架开发-Django的Forms组件

    校验字段功能 针对一个实例:用户注册. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) ...

  7. Django组件—forms组件

    forms组件: 校验字段功能: 针对一个实例:注册用户. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...

  8. Django组件——forms组件

    一.校验字段功能 通过注册用户这个实例来学习校验字段功能. 1.模型:models.py from django.db import models # Create your models here. ...

  9. 12 Django组件-forms组件

    forms组件 校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...

随机推荐

  1. 搭建Eureka注册中心

    创建一个Spring Boot工程,命名为eureka-server,并在pom.xml中引入必要的依赖,代码如下. <parent> <groupId>org.springf ...

  2. sips 命令(iMac 下系统自带)

    2. sips 2.1 -Z 指定最大宽高 //等比例缩放 scaleFill $ sips -Z 300 hgl.png $ for i in *.jpg;do sips -Z 300 " ...

  3. 【BZOJ4007】[JLOI2015]战争调度(动态规划)

    [BZOJ4007][JLOI2015]战争调度(动态规划) 题面 BZOJ 洛谷 题解 神仙题,我是做不来. 一个想法是设\(f[i][j]\)表示当前考虑到\(i\)节点,其子树内有\(j\)个人 ...

  4. Redis的两种持久化方式详细介绍

    一,Redis是一款基于内存的数据库,可以持久化,在企业中常用于缓存,相信大家都比较熟悉Redis了,下面主要分享下关于Redis持久化的两种模式 1.半持久化模式(RDB,filesnapshott ...

  5. Sql知识点总结

    一.数据库对象:表(table) 视图(view) 序列(sequence) 索引(index) 同义词(synonym) 视图(view) : 存储起来的 select 语句 create view ...

  6. Spring Boot学习总结一

    Spring Boot大大简化了之前java项目的繁琐xml配置,本文简单的总结下spring boot的相关知识. 1,@RestController 配置在controller中就是control ...

  7. CMakeList.txt(3): 一个cmake实例

    介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo. 先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为: 1. 编 ...

  8. 定时调度系列之Quartz.Net详解

    一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...

  9. JavaWeb处理GET、POST时的编码乱码问题

    对于GET方法,只要设置了res.setContentType("text/html;charset=UTF-8"), req.getParameter()就不会产生乱码. 对于P ...

  10. 关于vue中如何配置echarts以及使用方法

    ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等) ...