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>