Django 框架 Form组件
一、Form组件简介
Form组件是django中一个非常强大的组件,在处理服务端和前端的交互上大大的提高了开发人员的开发速度。
Form组件的功能:
- 用于处理前后端的数据认证(显示错误信息)
- 用于生成HTML代码
- 处理form表单提交过来的数据
- 初始化客户端显示的内容
二、Form的实现方式
创建Form对象:
from django import forms
from django.forms import fields #创建类,继承Form
class StudentMessage(forms.Form):
#创建字段
name=fields.CharField(
max_length=8,
min_length=3,
required=None,)
age=fields.IntegerField(max_value=99,min_value=18)
email=fields.EmailField()
Form的简单使用:
def add_student(request):
if request.method=="GET":
obj = StudentMessage() #生成一个Form对象,并传入前端
return render(request,"add_student.html",{"obj":obj}) elif request.method=="POST":
#这里再创建对象,这次是用来验证传输过来的数据
obj = StudentMessage(request.POST)
if obj.is_valid(): #验证数据
print(obj.cleaned_data) #获取前端传过来的数据
StudentInfo.objects.create(**obj.cleaned_data)
return redirect("/show_student")
else:
return render(request,"add_student.html",{"obj":obj})
Form的前端处理:
<form action="/add_student/" method="post">
<p>{{ obj.name }}{{ obj.errors.name.0 }}</p> #{{ obj.name }}渲染的时候就会自动生成input的框
<p>{{ obj.age }}{{ obj.errors.age.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.age.0 }}</p>
<input type="submit" value="提交">
</form>
以上就是一个简单的使用流程。
三、验证功能详解
def edit_student(request,nid):
if request.method == "GET": #处理get请求时的处理方式
student_data = StudentInfo.objects.filter(id=nid).first() #获取数据库的数据
obj = StudentMessage({"name":student_data.name,"age":student_data.age,"email":student_data.email}) #将数据库的数据作为input的默认值,或是在编辑时候的值
return render(request,"edit_student.html",{"obj":obj,
"nid":nid})
elif request.method == "POST": #处理post请求时的处理流程
obj = StudentMessage(request.POST)
if obj.is_valid(): #这里就会对数据处理,但是这里仅处理数据的格式等问题,如果格式没有什么问题就会举行执行
StudentInfo.objects.filter(id=nid).update(**obj.cleaned_data)
return redirect("/show_student")
else: #如果格式有误就执行这个代码,这时obj里面就有错误是信息
return render(request,"edit_student.html",{"obj":obj})
四、Form的内置的常用的字段
CharField(Field) #对字符串进行格式验证
max_length=None, 最大长度
min_length=None, 最小长度
strip=True 是否移除用户输入空白 IntegerField(Field) #对整数进行认证
max_value=None, 最大值
min_value=None, 最小值 #对时间日期等格式进行认证
DateField(BaseTemporalField) 格式:2015-09-01
TimeField(BaseTemporalField) 格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 #对邮箱的数据类型进行认证
EmailField(CharField) #对文件类型进行
FileField(Field)
allow_empty_file=False 是否允许空文件 #用于扩展
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二次筛选
#对IP地址进行认证
GenericIPAddressField
protocol='both', both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
四、form的其他插件
前面的常用的字段类型生成的都是input的标签,form的其他组件就可以生成其他不同类型的form表单内的标签。
# 通过widget属性的改变来更改标签的生成类型
# initial 属性是默认选择的意思 # 但radio,接收的值为字符串
# user = fields.CharField(
# initial=2, #默认选择中
# widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
# ) # 单radio,值为字符串
# user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# initial=2,
# widget=widgets.RadioSelect
# ) # 单select,值为字符串
# user = fields.CharField(
# initial=2,
# widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
# ) # 单select,值为字符串
# user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# initial=2,
# widget=widgets.Select
# ) # 多选的必须有MultipleChoiceField创建
# 多选select,值为列表
# user = fields.MultipleChoiceField(
# choices=((1,'上海'),(2,'北京'),),
# initial=[1,],
# widget=widgets.SelectMultiple
# ) # 单checkbox
# user = fields.CharField(
# widget=widgets.CheckboxInput()
# ) # 多选checkbox,值为列表
# user = fields.MultipleChoiceField(
# initial=[2, ],
# choices=((1, '上海'), (2, '北京'),),
# widget=widgets.CheckboxSelectMultiple
# )
注意:在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator class MyForm(Form): user = fields.ChoiceField(
# choices=((1, '上海'), (2, '北京'),),
initial=2,
widget=widgets.Select
) def __init__(self, *args, **kwargs):
super(MyForm,self).__init__(*args, **kwargs)
# self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
# 实施更新数据库的方式
self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')
五、关于Form组件的扩展
扩展form中的正则表达式的验证:
class EasyForm(forms.Form):
'''
方式一:
1、使用 validators字段
2、字段右边是一个列表
3、列表的每个元素是一个正则的匹配方法
4、列表的每个元素是RegexValidator的实例
5、RegexValidator的实例化需要两个参数,一个是正则表达式,一个是匹配错误时的错误信息
'''
phone = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$',"请输入数字"),RegexValidator(r'^159[0-9]+&',"数字必须是159开头")],
)
自定义Form的方式扩展,验证方式,基于源码的方式
class OutoForm(forms.Form):
name = fields.CharField(max_length=20)
def clean_name(self):
v = self.cleaned_data["name"]
if StudentInfo.objects.filter(name=v).count(): #这里可以对用户名存在认证,
raise ValidationError("用户名已存在")
return v
'''
通过源码扩展:
1、写方法名clean_字段名的形式:这里有需要再判断的name字段,所以方法名为:clean_name
2、必须要有返回值,如果是没有错的数据,返回值必须为self.cleaned_data['字段名']
3、必须继承ValidationError异常类
4、如果数据有误,必须抛出异常
5、异常的参数可以填写,这个参数会是一个错误信息
6、短板:仅可以在当前字段进行操作,多字段时无效
'''
对多字段时的扩展
class AjaxForm(forms.Form):
username = fields.CharField()
user_id = fields.IntegerField(
widget=widgets.Select(choices=[(0, 'alex'), (1, '刘皓宸'), (2, '杨建'), ])
) # 自定义方法 clean_字段名
# 必须返回值self.cleaned_data['username']
# 如果出错:raise ValidationError('用户名已存在')def clean(self):
value_dict = self.cleaned_data
v1 = value_dict.get('username')
v2 = value_dict.get('user_id')
if v1 == 'root' and v2 == 1:
raise ValidationError('整体错误信息')
return self.cleaned_data
Django 框架 Form组件的更多相关文章
- Django框架----Form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Django框架----Form组件补充
一.Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML; 1.Django内置字段如下: 1 Field 2 required=T ...
- python框架之Django(10)-Form组件
介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用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的Form组件
[Django的Form组件] Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 Form类的使 ...
随机推荐
- windows上测试磁盘io性能
一.问题由来 前两天搭建一套演示环境,同样的java war包,放在我们这边服务器好好的,放在那边就运行缓慢. 后来把日志改成异步之后就好了. 后边找了个程序测了下io性能,竟然差了7,8倍. 二.软 ...
- ResDepot CRC码
参考: 百度百科 crc校验 百度百科 crc编码 生日悖论 CRC32能不能用于检验文件的相同性 Egret RES版本控制 一.Egret的ResDepot在发布时,可以添加crc码. 发布前 发 ...
- GDI+绘制五星红旗
五星红旗是由红色背景,加5个黄色五角星组成.绘制一个五星红旗的思路,就是先定义一个五角星的自定义控件,然后通过设置五角星的大小.位置.旋转角度等属性,组合成一个五星红旗. 五角星自定义控件代码: pu ...
- 1.浅谈CLR
1.什么是CLR CLR(Common Language Runtime)公共语言远行时,是一个可由多种编程语言使用的“远行时”.CLR的核心功能(比如内存管理.程序集加载.安全性.异常处理和线程同步 ...
- python分支语句
一.if else语句 if 条件表达式: else: a = 3 b = 4 if a >= b: print("a >= b") else: print(" ...
- java编程感悟02
很多时候我们需要网上查阅他人的代码,如果代码比较长或者注释较少,阅读起来就会比较费劲,这时需要培养快速读懂应用他人的代码的能力. 实现图片的旋转功能: import java.awt.geom.Aff ...
- vs2017默认以管理员运行
1. 打开VS的安装目录,找到devenv.exe,右键,选择“兼容性疑难解答”. 2. 选择“疑难解答程序” 3. 选择“该程序需要附加权限” 4. 确认用户帐户控制后,点击测试程序,不然这个对话框 ...
- 一篇采访窥C#的未来
今天坐公交时用手机打开 .NET Blog 阅读这周的 The week in .NET ,在看 Virtual Panel: What's Next for .NET? 这篇采访报道时,被其中对 R ...
- [No0000146]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈3/4
前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...
- PHP-之POSIX系列函数和兼容Perl系列函数比较
PHP有两种正则系列函数 POSIX 系列和兼容Perl系列的函数 在PHP大于5.3使用POSIX系列函数会报E_DEPRECATED 错误, POSIX系列函数在大于5.3版本不建议使用,PHP7 ...