django组件之form
form组件
首先要了解form组件的一些基本语法:
1. 校验数据:
form组件校验的是字典,所以数据应该以字典形式传进去
form 校验,可以多传数据,不要紧(只校验form组件有的,但是少栓不行)
但是不能少传,就是说form组件有的字段都应该有的
ef=EmpFoem(dict) 构造对象
ef.is_valid() 方法:校验
切记:只有经过is_valid才有有下面两个属性
经过is_valid校验的数据会把数据封装到两个对象:
object.cleaned_data #验证通过,干净的数据
object.errors #验证不通过,错误的信息
form组件功能之校验功能
针对一个添加员工功能详解:
模型models.py
from django.db import models # Create your models here.
class Emp(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
salary=models.DecimalField(max_digits=5,decimal_places=2)
添加页面
addEmp.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h3>添加员工表</h3>
传统添加
<form action="" method="post">
{% csrf_token %}
姓名
<input type="text" name="name">
年龄
<input type="text" name="age">
薪水
<input type="text" name="salary">
<input type="submit" value="提交">
</form>
</body>
</html>
视图函数views.py
from django.shortcuts import render,HttpResponse
from app01 import models
from django.core.exceptions import NON_FIELD_ERRORS,ValidationError
# Create your views here. from django import forms #导入form组件
class EmpForm(forms.Form): #要继承form组件,要不然他就是普通的一个类,下面的字段是规则(约束)
name=forms.CharField(min_length=5,label='姓名',error_messages={'required':'该字段不能为空'})
age=forms.IntegerField(label='年龄')
salary=forms.CharField(label='薪水')
def addEmp(request):
if request.method=='GET':
return render(request,'addEmp.html',locals())
else:
# print(request.POST)
data=request.POST #这是一个字典对象可以直接传
form=EmpForm(data) #用传进来的数据构造对象
if form.is_valid():
print(form.cleaned_data)
print(form.errors)
models.Emp.objects.create(**form.cleaned_data) return HttpResponse('添加成功')
else:
print(form.cleaned_data)
print(form.errors)
return render(request,'addEmp.html',locals())
form组件之渲染标签功能
首先要明确的是,不管哪一种渲染方法,都不会帮你构建form表单,提交按钮,以及csrf_token钥匙,所以说这三部分都需要自己去构建.
views.py
def addEmp(request):
if request.method=='GET':
form=EmpForm() #空的form,用来渲染页面的
return render(request,'addEmp.html',locals())
else:
# print(request.POST)
data=request.POST #这是一个字典对象可以直接传
form=EmpForm(data) #用传进来的数据构造对象
if form.is_valid():
print(form.cleaned_data)
print(form.errors)
models.Emp.objects.create(**form.cleaned_data) return HttpResponse('添加成功')
else:
print(form.cleaned_data)
print(form.errors)
return render(request,'addEmp.html',locals())
渲染方式一
<h3>渲染方法一</h3>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }} #循环打印,把form中的字段一一打印出来
<input type="submit">
</form>
效果:
渲染方式二
<h3>渲染方法二</h3>
<form action="" method="post" novalidate>
{% csrf_token %}
<div>
<label for="">姓名</label>
{{ form.name }} <span>{{ form.name.errors.0 }}</span>
</div>
<div>
<label for="">年龄</label>
{{ form.age }}<span>{{ form.age.errors.0 }}</span>
</div>
<div>
<label for="">薪水</label>
{{ form.salary }} <span>{{ field.form.errors.0 }}</span>
</div>
<input type="submit" value="提交">
</form>
效果:
渲染方式三
<h3>渲染方法三</h3>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }} <span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit">
</form>
效果:
form组件之显示错误与重置输入信息功能
视图views.py
def addEmp(request):
if request.method=='GET': #第一次请求get渲染输入标签给客户端
form=EmpForm()
return render(request,'addEmp.html',locals())
else:
# print(request.POST) #post请求
data=request.POST #这是一个字典对象可以直接传
form=EmpForm(data) #用传进来的数据构造对象
if form.is_valid(): #把构造的对象进行校验
print(form.cleaned_data)
print(form.errors) #校验通过就写入数据库
models.Emp.objects.create(**form.cleaned_data) return HttpResponse('添加成功')
else: #校验不通过
print(form.cleaned_data)
print(form.errors)
return render(request,'addEmp.html',locals()) #校验过后还是渲染一个页面返回会用户.只不过这个页面渲染的已经不是一个空form对象,而是用户输入的信息对象
#form=EmpForm(data),同时我们可以在input标签放置span标签,把错误信息赋值给span
models.py
<h3>渲染方法三</h3>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }} <span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit">
</form>
form组件之局部钩子与全局钩子
views.py
from django import forms #导入form组件
class EmpForm(forms.Form): #要继承form组件,要不然他就是普通的一个类,下面的字段是规则(约束)
name=forms.CharField(min_length=5,label='姓名',error_messages={'required':'该字段不能为空'})
age=forms.IntegerField(label='年龄')
salary=forms.CharField(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_age(self):
val=self.cleaned_data.get("age")
if int(val) > 100:
raise ValidationError('年龄不能大于100')
else:
return val
def addEmp(request):
if request.method=='GET':
form=EmpForm()
return render(request,'addEmp.html',locals())
else:
# print(request.POST)
data=request.POST #这是一个字典对象可以直接传
form=EmpForm(data) #用传进来的数据构造对象
if form.is_valid():
print(form.cleaned_data)
print(form.errors)
models.Emp.objects.create(**form.cleaned_data) return HttpResponse('添加成功')
else:
print(form.cleaned_data)
print(form.errors)
return render(request,'addEmp.html',locals())
页面addEmp.html
<h3>渲染方法三</h3>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }} <span>{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit">
</form>
django组件之form的更多相关文章
- Django组件之Form表单
一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...
- Django中的form组件
Django中的form组件有两大作用 1.验证获取正确的结果或者错误信息 2.生成html代码 一.为什么需要form组件呢? 在写form表单,提交数据时,自己写验证的代码是一件非常困难的事情. ...
- Django框架之Form组件
一.初探Form组件 在介绍Form组件之前,让大家先看看它强大的功能吧!Go... 下面我们来看看代码吧! 1.创建Form类 from django.forms import Form from ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- Django 框架之Form组件
1. Django的Form主要具有以下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交的数据 初始化页面显示内容 2. 第一个案例: # 第一步: 创建 ...
- Django基础之form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django总结及Form组件
一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,reverse , exclude(排除),c ...
- Django框架 之 form组件的钩子
Django框架 之 form组件的钩子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 3 ...
- Django框架 之 form组件
Django框架 之 form组件 浏览目录 Form介绍 普通的登录 使用form组件 Form详情 常用字段 校验 进阶 使用Django Form流程 一.Form介绍 我们之前在HTML页面中 ...
随机推荐
- day35-hibernate映射 03-Hibernate持久态对象自动更新数据库
持久态对象一个非常重要的能力:自动更新数据库. package cn.itcast.hibernate3.demo1; import static org.junit.Assert.*; import ...
- 使用Java创建JSON数据
--------------siwuxie095 工程名:TestCreateJSON 包名:com.siwuxie095.json 类名:Cr ...
- Opencv读取图片像素值并保存为txt文件
#include <opencv2/opencv.hpp>#include<vector>#include <fstream> using namespace st ...
- Mat表达式
利用C++中的运算符重载,Opencv2中引入了Mat运算表达式.这一新特点使得使用c++进行编程时,就如同写Matlab脚本. 例如: 如果矩阵A和B大小相同,则可以使用如下表达式: C=A+B+1 ...
- 精美3D中国象棋
本人2013年的巅峰之作,现在已经完全免费放送.象棋界面的史诗革命.当前下载版本仅支持Windows 平台. 操作: 方向键的 上,下,左,右 控制棋盘翻转.Home 键回到初始状态,End按键回到平 ...
- js教程--从入门到精通 第一篇 js的前世今生以及js中基本数据类型和引入方式
1.Javascript前世今生 1.1.什么是Javascript Javascript运行于Javascript [解释器/引擎]中的解释性脚本语言 Javascript ...
- java全栈day01-02入门案例
一 在开始案例之前,我们需要了解一下Java应用程序的编写流程. 通过上图我们可以了解到编写的程序大致如下: 1 源文件:编写Java源文件(我们也称之为源代码文件),它的扩展名为.java: 2 ...
- HTML5与CSS3基础教程(第7版) 高清PDF扫描版
HTML5与CSS3基础教程(第7版)试读不仅介绍了文本.图像.链接.列表.表格.表单.多媒体等网页元素,也介绍了如何为网页设计结构.布局,添加动态效果.格式化等形式,此外还涉及调试和发布.聚合和吸引 ...
- C#根据弹窗标题获取窗体句柄并模拟点击按钮(FindWindow,FindWindowEx,SendMessage)
任务:将下面弹窗自动关闭 /// <summary> /// 找到窗口 /// </summary> /// <param name="lpClassName& ...
- CS基本网络中Agent使用双网卡进行流量划分
两台服务器,一台服务器作为管理节点[单网卡],一台服务器作为计算节点[双网卡] ------------------------------------------------------------ ...