Django组件-Forms组件
Django的Forms组件主要有以下几大功能:
- 页面初始化,生成HTML标签
- 校验用户数据(显示错误信息)
- HTML Form提交保留上次提交数据
一、小试牛刀
1、定义Form类
- from django import forms
- class EmpForm(forms.Form):
- name = forms.CharField(min_length=5, label="姓名", error_messages={"required": "该字段不能为空!",
- "min_length": "用户名太短。"})
- age = forms.IntegerField(label="年龄")
- salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资")
2、设计url与视图对应关系
- from django.urls import path
- from app01 import views
- urlpatterns = [
- path('add_emp/', views.add_emp),
- ]
3、视图函数
- from app01.MyForms import EmpForm
- def add_emp(request):
- if request.method == "GET":
- form = EmpForm() # 初始化form对象
- return render(request, "add_emp.html", {"form":form})
- else:
- form = EmpForm(request.POST) # 将数据传给form对象
- if form.is_valid(): # 进行校验
- data = form.cleaned_data # 校验通过的数据,字典
- print(data)
- models.Emp.objects.create(**data)
- return redirect("/index/")
- else: # 校验失败
- print(form.errors)
- return render(request, "add_emp.html", {"form": form})
4、模板文件
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- </head>
- <body>
- <h3>添加员工</h3>
- {#1、自己手动写HTML页面#}
- {#<form action="" method="post">#}
- {# <p>姓名:<input type="text" name="name"></p>#}
- {# <p>年龄:<input type="text" name="age"></p>#}
- {# <p>工资:<input type="text" name="salary"></p>#}
- {# <input type="submit">#}
- {#</form>#}
- {#2、通过form对象的as_p方法实现#}
- {#<form action="" method="post" novalidate>#}
- {# {% csrf_token %}#}
- {# {{ form.as_p }}#}
- {# <input type="submit">#}
- {#</form>#}
- {#3、手动获取form对象的字段#}
- {#<form action="" method="post" novalidate>#}
- {# {% csrf_token %}#}
- {# <div>#}
- {# <label for="id_{{ form.name.name }}">姓名</label>#}
- {# {{ form.name }} <span>{{ form.name.errors.0 }}</span>#}
- {# </div>#}
- {# <div>#}
- {# <label for="id_{{ form.age.name }}">年龄</label>#}
- {# {{ form.age }} <span>{{ form.age.errors.0 }}</span>#}
- {# </div>#}
- {# <div>#}
- {# <label for="id_salary">工资</label>#}
- {# {{ form.salary }} <span>{{ form.salary.errors.0 }}</span>#}
- {# </div>#}
- {# <input type="submit">#}
- {#</form>#}
- {#4、用for循环展示所有字段#}
- <form action="" method="post" novalidate>
- {% csrf_token %}
- {% for field in form %}
- <div>
- <label for="id_{{ field.name }}">{{ field.label }}</label>
- {{ field }} <span>{{ field.errors.0 }}</span>
- </div>
- {% endfor %}
- <input type="submit">
- </form>
- </body>
- </html>
附:Django内置的字段及属性
- Field
- required=True, 是否允许为空
- widget=None, HTML插件
- label=None, 用于生成Label标签或显示内容
- initial=None, 初始值
- help_text='', 帮助信息(在标签旁边显示)
- error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
- show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
- validators=[], 自定义验证规则
- localize=False, 是否支持本地化
- 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类型
- ...
Django内置字段
二、局部钩子和全局钩子
1、定义Form类
- from django import forms
- from django.core.exceptions import ValidationError
- from app01 import models
- class EmpForm(forms.Form):
- name = forms.CharField(min_length=5, label="姓名", error_messages={"required": "该字段不能为空!",
- "min_length": "用户名太短。"})
- age = forms.IntegerField(label="年龄")
- salary = forms.DecimalField(max_digits=5, decimal_places=2, label="工资")
- r_salary = forms.DecimalField(max_digits=5, decimal_places=2, label="请再输入工资")
- def clean_name(self): # 局部钩子
- val = self.cleaned_data.get("name")
- if val.isdigit():
- raise ValidationError("用户名不能是纯数字")
- elif models.Emp.objects.filter(name=val):
- raise ValidationError("用户名已存在!")
- else:
- return val
- def clean(self): # 全局钩子 确认两次输入的工资是否一致。
- val = self.cleaned_data.get("salary")
- r_val = self.cleaned_data.get("r_salary")
- if val == r_val:
- return self.cleaned_data
- else:
- raise ValidationError("请确认工资是否一致。")
2、视图函数
- def add_emp(request):
- if request.method == "GET":
- form = EmpForm() # 初始化form对象
- return render(request, "add_emp.html", {"form":form})
- else:
- form = EmpForm(request.POST) # 将数据传给form对象
- if form.is_valid(): # 进行校验
- data = form.cleaned_data
- data.pop("r_salary")
- models.Emp.objects.create(**data)
- return redirect("/index/")
- else: # 校验失败
- clear_errors = form.errors.get("__all__") # 获取全局钩子错误信息
- return render(request, "add_emp.html", {"form": form, "clear_errors": clear_errors})
3、模板文件
- <form action="" method="post" novalidate>
- {% csrf_token %}
- <div>
- <label for="id_{{ form.name.name }}">姓名</label>
- {{ form.name }} <span>{{ form.name.errors.0 }}</span>
- </div>
- <div>
- <label for="id_{{ form.age.name }}">年龄</label>
- {{ form.age }} <span>{{ form.age.errors.0 }}</span>
- </div>
- <div>
- <label for="id_salary">工资</label>
- {{ form.salary }} <span>{{ form.salary.errors.0 }}{{ clear_errors.0 }}</span>
- </div>
- <div>
- <label for="id_r_salary">请再输入工资</label>
- {{ form.r_salary }} <span>{{ form.r_salary.errors.0 }}{{ clear_errors.0 }}</span>
- </div>
- <input type="submit">
- </form>
Django组件-Forms组件的更多相关文章
- django之forms组件
在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...
- python 全栈开发,Day78(Django组件-forms组件)
一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...
- django第13天(auth组件,forms组件,中间件,csrf)
django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...
- 08 Django组件-Forms组件
Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...
- Django组件--forms组件(注册用)
一.forms组件--校验类的使用 二.form组件--校验类的参数 三.forms组件校验的局部钩子--自定义校验规则(要看源码理解) 四.forms组件校验的全局钩子--校验form表单两次密码输 ...
- web框架开发-Django的Forms组件
校验字段功能 针对一个实例:用户注册. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) ...
- Django组件—forms组件
forms组件: 校验字段功能: 针对一个实例:注册用户. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...
- Django组件——forms组件
一.校验字段功能 通过注册用户这个实例来学习校验字段功能. 1.模型:models.py from django.db import models # Create your models here. ...
- 12 Django组件-forms组件
forms组件 校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...
随机推荐
- 搭建Eureka注册中心
创建一个Spring Boot工程,命名为eureka-server,并在pom.xml中引入必要的依赖,代码如下. <parent> <groupId>org.springf ...
- sips 命令(iMac 下系统自带)
2. sips 2.1 -Z 指定最大宽高 //等比例缩放 scaleFill $ sips -Z 300 hgl.png $ for i in *.jpg;do sips -Z 300 " ...
- 【BZOJ4007】[JLOI2015]战争调度(动态规划)
[BZOJ4007][JLOI2015]战争调度(动态规划) 题面 BZOJ 洛谷 题解 神仙题,我是做不来. 一个想法是设\(f[i][j]\)表示当前考虑到\(i\)节点,其子树内有\(j\)个人 ...
- Redis的两种持久化方式详细介绍
一,Redis是一款基于内存的数据库,可以持久化,在企业中常用于缓存,相信大家都比较熟悉Redis了,下面主要分享下关于Redis持久化的两种模式 1.半持久化模式(RDB,filesnapshott ...
- Sql知识点总结
一.数据库对象:表(table) 视图(view) 序列(sequence) 索引(index) 同义词(synonym) 视图(view) : 存储起来的 select 语句 create view ...
- Spring Boot学习总结一
Spring Boot大大简化了之前java项目的繁琐xml配置,本文简单的总结下spring boot的相关知识. 1,@RestController 配置在controller中就是control ...
- CMakeList.txt(3): 一个cmake实例
介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo. 先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为: 1. 编 ...
- 定时调度系列之Quartz.Net详解
一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...
- JavaWeb处理GET、POST时的编码乱码问题
对于GET方法,只要设置了res.setContentType("text/html;charset=UTF-8"), req.getParameter()就不会产生乱码. 对于P ...
- 关于vue中如何配置echarts以及使用方法
ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等) ...