Django的form组件
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组件的更多相关文章
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
- python Django之Form组件
python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...
- Django之Form组件(一)
Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...
- python框架之Django(10)-Form组件
介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入 ...
- 〖Python〗-- Django的Form组件
[Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...
- Django之Form组件验证
今天来谈谈Django的Form组件操作 Django中的Form一般有两种功能: ·输入html ·验证用户输入 Form验证流程 ·定义规则(是一个类) ·前端把数据提交过来 ·匹配规则 · ...
- django 使用form组件提交数据之form表单提交
django的form组件可以减少后台在进行一些重复性的验证工作,极大降低开发效率. 最近遇到一个问题: 当使用form表单提交数据后,如果数据格式不符合后台定义的规则,需要重新在前端页面填写数据. ...
- web之Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
随机推荐
- Pytest 简明教程
pytest-learn 通过文章 Python 单元测试框架之 Pytest 剖解入门(第一篇) 学习 Pytest. 有很多的第三方插件可以自定义扩展,并且支持 Allure,生成可视化的测试报告 ...
- ASP.NET Core2.1 中如何使用 Cookie和Session
https://blog.csdn.net/canduecho/article/details/80651853 ASP.NET Core2.1的官方项目模板在创建的Razor Pages和MVC项目 ...
- P4822 [BJWC2012]冻结
思路 和p4568类似的分层图最短路 从上一层向下一层连边权/2的边即可 代码 #include <cstdio> #include <algorithm> #include ...
- WebPack填坑笔记
loader使用时不需要用require引入,在使用plugins(插件)才需要使用require引入 压缩js代码会导致热更新失效 所以开发环境先不要进行压缩 给css加前缀的 postcss-lo ...
- java中Properties类及读取properties中属性值
本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...
- HDU 3635 Dragon Balls(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3635 题意: 有n颗龙珠和n座城市,一开始第i颗龙珠就位于第i座城市,现在有2种操作,第一种操作是将x龙珠所在城 ...
- python学习 day013打卡 内置函数
本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...
- C#深入多线程
主线程: th = Thread.CurrentThread; //现在的线程为主线程 th.Name = "MainThread"; //set线程名字:主线程本身没有名字 th ...
- Windows下使用命令安装Python的scipy库出错的解决
平时使用Python都是在Sublime下使用,不想使用IDE.使用各种库时安装也就是使用pip安装即可.来说说今天自己遇到的一个问题:使用scipy数学库时,使用命令: pip install sc ...
- 理解 Redis(1) - Redis 简介
Redis 的含义 全称: REmote DIctionary Server 远程词典服务器 由于支持 string, list, set, ordered set, hash 等多重数据结构, 因此 ...