forms组件

forms组件,是一个类。在视图函数中创建一个类,类需要继承forms.Form

from django import  forms

1.校验数据

步骤和语法:

  1. 创建一个forms类,该类需继承forms.Form  , 得到一个类(假设为EmpForm),用于校正数据

  2.把用户信息传给ef=EmpForm(request.POST),得到一个form对象ef(传入的数据必须为字典)

  3. ef.is_valid()  ,数据都合格为True ,否则为False

  4.ef.is_valid()之后可以获取两部分数据:

    ef.cleand_data  获取合格后的数据,为字典

    ef.errors 不合格数据以及错误信息

  

model.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=8,decimal_places=2)

视图函数中:

from django.shortcuts import render,HttpResponse,redirect
from aap1 import models
# Create your views here.
from django import forms
#forms 组件是一个类,对数据进行校正,下面是分别对name,age 字段进行较正
class EmpForm(forms.Form):
#且所有要校正的字段必须为非空,否则会报错
name = forms.CharField(max_length=5) #name需要校验的字段 ,forms. 后面跟的是规则对象,此处为CharField()
age = forms.IntegerField() #此校验规则,必须为一个数字 def addemp(request): if request.method=="GET":
return render(request,"add.html") else:
#获取字段值
# name =request.POST.get("name")
# age =request.POST.get("age")
# salary =request.POST.get("salary")
# # 类 ,操作简单,耦合性比较好
ef = EmpForm(request.POST) #得到一个form对象
if ef.is_valid():
print(ef.cleaned_data) #得到校正合格之后的数据,也是一个字典
models.Emp.objects.create(**ef.cleaned_data) #传入一个字典,但是这样创建的话,需要将Emp中所有字段都进行校验或默认
else:
print(ef.errors) #得到错误信息字典
return HttpResponse("ok")

2.渲染页面

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=8,decimal_places=2)
#后端views.py 文件中:(form组件的构建)

from django import forms
from django.core.exceptions import ValidationError
#forms 组件是一个类,创建一个需要渲染或检验的form组件
class EmpForm(forms.Form):
#且所有要校正的字段必须为非空,否则会报错
name = forms.CharField(max_length=5,label="姓名",error_messages={"required":"该字段不能为空"}) #name需要校验的字段 ,forms. 后面跟的是规则对象,此处为CharField()
age = forms.IntegerField(label="年龄") #此校验规则,必须为一个数字
salary=forms.CharField(label="薪水")
#视图函数,
def addemp(request): if request.method=="GET":
form =EmpForm()
return render(request,"add.html",locals()) # locals(),将form 中所有的字段都可以传给前端页面进行渲染 else:
#post请求得到,request.post 接收到前端传来的数据中的key必须和form组件中的字段名一样,不然无法进行校正,也就不能像下面一样传值
form = EmpForm(request.POST) #得到一个form对象

if form.is_valid(): #校正通过
print(form.cleaned_data) #得到干净的数据
models.Emp.objects.create(**form.cleaned_data) #数据干净后创建员工
return HttpResponse("添加成功")
else:
        #校正没通过后向前端显示错误信息
print(form.errors)
return render(request,"add.html",{"form":form})

渲染方式一:

<h3>渲染方式1</h3>
<form action="">
{% csrf_token %}
{{ form.as_p }} #
<input type="submit">
</form>

渲染后:

<h3>渲染方式1</h3>
<form action="">
<input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">
<p><label for="id_name">姓名:</label> <input type="text" name="name" maxlength="5" required id="id_name"></p>
   <p><label for="id_age">年龄:</label> <input type="number" name="age" required id="id_age"></p>
   <p><label for="id_salary">薪水:</label> <input type="text" name="salary" required id="id_salary"></p>
<input type="submit">
</form>

页面效果:

渲染方式二:

前端代码:

<h3>渲染方式2</h3>
<form action="">
{% csrf_token %}
<div>
<label for="">姓名</label>
{{ form.name }}
</div>
<div>
<label for="">年龄</label>
{{ form.age }}
</div>
<div>
<label for="">薪水</label>
{{ form.salary }}
</div> <input type="submit">
</form>

渲染后:

<h3>渲染方式2</h3>
<form action="">
<input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb">
<div>
<label for="">姓名</label>
<input type="text" name="name" maxlength="5" required id="id_name">
</div>
<div>
<label for="">年龄</label>
<input type="number" name="age" required id="id_age">
</div>
<div>
<label for="">薪水</label>
<input type="text" name="salary" required id="id_salary">
</div> <input type="submit">
</form>

页面效果:

渲染方式三:

<h3>渲染方式3</h3>
<form action="" method="post" novalidate>
{% csrf_token %}
{% for flied in form %}
<div>
<label for="">{{ flied.label }}</label>
{{ flied }} <span>{{ flied.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit">
</form>

渲染后:

<h3>渲染方式3</h3>
<form action="" method="post" novalidate>
<input type="hidden" name="csrfmiddlewaretoken" value="85HSKETnbwtkVgBId2g0eZ0GFmGoYqZ2oPcvdUQmupCH8hiWPFRWMsoXw7EV9YEb"> <div>
<label for="">姓名</label>
<input type="text" name="name" maxlength="5" required id="id_name"> <span></span>
</div> <div>
<label for="">年龄</label>
<input type="number" name="age" required id="id_age"> <span></span>
</div> <div>
<label for="">薪水</label>
<input type="text" name="salary" required id="id_salary"> <span></span>
</div> <input type="submit">
</form>

效果图:

3.显示错误与重置输入信息功能

视图:

def register(request):

    if request.method=="POST":
form=UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data) # 所有干净的字段以及对应的值
else:
print(form.cleaned_data) #
print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
print(form.errors.get("name")) # ErrorList ["错误信息",]
return render(request,"register.html",locals())
form=UserForm()
return render(request,"register.html",locals())

模板:

<form action="" method="post" novalidate>
{% csrf_token %} {% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-default"> </form>

4.局部钩子与全局钩子

视图

# forms组件
from django.forms import widgets wid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"}) from django.core.exceptions import ValidationError
class UserForm(forms.Form):
name=forms.CharField(max_length=32,
widget=wid_01
)
pwd=forms.CharField(max_length=32,widget=wid_02)
r_pwd=forms.CharField(max_length=32,widget=wid_02)
email=forms.EmailField(widget=wid_01)
tel=forms.CharField(max_length=32,widget=wid_01) # 局部钩子
def clean_name(self):
val=self.cleaned_data.get("name")
if not val.isdigit():
return val
else:
raise ValidationError("用户名不能是纯数字!") # 全局钩子 def clean(self):
pwd=self.cleaned_data.get("pwd")
r_pwd=self.cleaned_data.get("r_pwd") if pwd==r_pwd:
return self.cleaned_data
else:
raise ValidationError('两次密码不一致!') def register(request): if request.method=="POST":
form=UserForm(request.POST)
if form.is_valid():
print(form.cleaned_data) # 所有干净的字段以及对应的值
else:
clean_error=form.errors.get("__all__") return render(request,"register.html",locals())
form=UserForm()
return render(request,"register.html",locals())

模板

<form action="" method="post" novalidate>
{% csrf_token %} {% for field in form %}
<div>
<label for="">{{ field.label }}</label>
{{ field }}
<span class="pull-right" style="color: red">
{% if field.label == 'R pwd' %}
<span>{{ clean_error.0 }}</span>
{% endif %}
{{ field.errors.0 }}
</span>
</div>
{% endfor %}
<input type="submit" class="btn btn-default"> </form>

forms组件知识补充:

model用法:
gender=models.IntegerField(choices=((1,"男"),(2,"女")),default=1)
alex=Author.objects.all().first()

alex.gender #
alex.get_gender_display() # "男" forms用法:
# Create your models here.
class Book(models.Model):
title = models.CharField( max_length=32)
pub_date=models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2)
state=models.IntegerField(choices=((1,"已出版"),(2,"未出版")),default=1)
publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE,null=True)
authors=models.ManyToManyField("Author",db_table="book2authors") # 创建关系表
def __str__(self):
return self.title # forms组件:
from django import forms
class BookForm(forms.Form):
title=forms.CharField(max_length=32)
price=forms.DecimalField(max_digits=5,decimal_places=2)
pub_date=forms.DateField()
state=forms.ChoiceField(choices=((1,"已出版"),(2,"未出版"))) #在前端的的效果 <option value=1>已出版<option> <option value=2>未出版<option>
# publish=forms.ChoiceField(choices=list(models.Publish.objects.all().values_list("pk","name")))
publish=forms.ModelChoiceField(queryset=models.Publish.objects.all())
authors=forms.ModelMultipleChoiceField(queryset=models.Author.objects.all()) # modelForm
class BookModelForm(forms.ModelForm):
class Meta:
model=models.Book
# fields=["title","price"]
# exclude = ["title"]
fields="__all__" #ModelForm 参数配置 class BookModelForm(forms.ModelForm):
class Meta:
model=models.Book
# fields=["title","price"]
# exclude = ["title"]
fields="__all__" #定义标签属性
widgets={
"title":wid.TextInput(attrs={"class":"form-control"}),
"price":wid.TextInput(attrs={"class":"form-control"})
}
error_messages={
"title":{"required":"该字段不能为空"}
}
labels={
"title":"书籍名称"
} def clean_title(self):
val=self.cleaned_data.get("title")
if val.startswith("yuan"):
return val
else:
raise ValidationError("必须以yuan开头!")

Django的form组件的更多相关文章

  1. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  2. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  3. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  4. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

  5. Django之Form组件(一)

    Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...

  6. python框架之Django(10)-Form组件

    介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...

  7. 〖Python〗-- Django的Form组件

    [Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...

  8. Django之Form组件验证

    今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类)    ·前端把数据提交过来 ·匹配规则 · ...

  9. django 使用form组件提交数据之form表单提交

    django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...

  10. web之Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

随机推荐

  1. Delphi XE5 for Android (九)

    Delphi XE5 下TEdit控件有个属性:KeyboardType,如下图:   该属性决定了当焦点进入TEdit时,系统弹出的输入窗体,按照其帮助文件说明,不同取值的输入窗体不同,如下图: 根 ...

  2. CodeChef - ELHIDARR Find an element in hidden array(互动题)题解

    题意:有一串不递减的串,串中的任意元素都有k个,除了一个元素,他只有1 <= n < k-1个,你现在能向oj做出以下操作: 输出:1 pos,oj会返回pos位置的元素值 输出:2 va ...

  3. 【做题】cf603E——线段树分治

    首先感谢题解小哥,他在标算外又总结了三种做法. 此处仅提及最后一种做法. 首先考虑题目中要求的所有结点度数为奇数的限制. 对于每一个联通块,因为所有结点总度数是偶数,所以总结点数也必须是偶数的.即所有 ...

  4. Directional RNA-seq data -which parameters to choose?

    Directional RNA-seq data -which parameters to choose? REF: https://chipster.csc.fi/manual/library-ty ...

  5. jd面试之感

    一面问题:问题都回答的很好,顺利进入二面 1.单点登录的改造和原理 2.hashmap 3.jvm:堆.方法区.栈,本地方法栈,gc,gc的方式 4.spring的ioc.aop的实现方式cglib和 ...

  6. Bootstrap 固定导航条

    默认情况下,导航条的定位属性为 static,它的位置由它的HTML代码中定义的顺序出现,并随着页面向下滚动而消失.也可以改变它的定位方式,让它固定显示在浏览器窗口的顶部或底部. 1.固定在顶部 如果 ...

  7. mysql联合主键自增、主键最大长度小记

    前言 一. 联合主键自增问题 今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕: 当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteId和cateId组成.所以 ...

  8. js控制的选项卡

    选项卡在各种网站网页上是随处可见的一种形式 今天就简单的讲解下 选项卡得制作方法 首先:思路: 我们做一个四个控制的选项卡  则应该有四个小的DIV 外边包裹着一个大的div 用四个input按钮来控 ...

  9. _spellmod_aura_trigger

    一.spell.dbc做一个空光环 二.配置_spellmod_aura_trigger表 comment 备注 aura 光环ID,有此光环时,才会触发下面技能 linkSpell1-3 链接的技能 ...

  10. Codeforces 746 G. New Roads

    题目链接:http://codeforces.com/contest/746/problem/G mamaya,不知道YY了一个什么做法就这样过去了啊 2333 首先我显然可以随便构造出一棵树满足他所 ...