Form表单验证

1.创建Form类(本质就是正则表达式的集合)

from django.forms import Form
from django.forms import fields
from django.forms import widgets
from Mybbs.models import *
import re class UserForm(Form):
username = fields.CharField(
required=True,
error_messages={'required':'用户名不能为空'},
widget=widgets.TextInput(attrs={'class':'form-control'})
) password = fields.CharField(
required=True,
error_messages={'required': '密码不能为空','invalid':'密码格式错误'},
widget = widgets.TextInput(attrs={'class': 'form-control'})
) ut_id = fields.ChoiceField(
choices=[],
widget=widgets.Select(attrs={'class':'form-control'})
) role_id = fields.MultipleChoiceField(
choices=[],
widget=widgets.SelectMultiple(attrs={'class':'form-control'})
)

创建自定义类继承Form,类属性最好与数据库字段名称相同:

required:不能为空
error_messages:错误信息
widget:渲染方式

# 如果需要读库的内容,则应该放入 类初始化方法中,不然数据库有更新,却更新不到页面,
# 因为类属性 只有在第一次生成的时候执行,而 初始化方法 在每次类被调用的时候都执行,能拿到第一手资料
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
# self.fields已经有所有拷贝的字段
self.fields['ut_id'].choices = models.UserType.objects.values_list('id', 'title')
self.fields['role_id'].choices = models.Role.objects.values_list('id', 'caption')

2.前端生成HTML

<form method="POST" novalidate>
{% csrf_token %}
<!--{{ form.as_p }} 生成form中所有的html标签 -->
<p>
用户名: {{ form.username }} {{ form.errors.username.0 }}
</p>
<p>
密码: {{ form.password }} {{ form.errors.password.0 }}
</p>
<p>
用户类型: {{ form.ut_id }} {{ form.errors.ut_id.0 }}
</p>
<p>
角色: {{ form.role_id }} {{ form.errors.role_id.0 }}
</p> <input type="submit" value="提交" />
</form>

novalidate:禁止浏览器弹出的错误

3.带默认值的好HTML标签:编辑界面

class EditUserView(AuthView,View):

    def get(self, request, pk):
obj = models.UserInfo.objects.filter(id=pk).first()
role_id_list = obj.rl.values_list('id')
v = list(zip(*role_id_list))[0] if role_id_list else []
form = UserForm(initial={'username': obj.username, 'password': obj.password, 'ut_id': obj.ut_id,'role_id':v})
return render(request,'edit_user.html',{'form':form}) def post(self,request,pk):
form = UserForm(data=request.POST)
if form.is_valid():
# # {'username': 'xxxxx', 'password': 'xxxxx', 'ut_id': '1',role_id:}
role_id = form.cleaned_data.pop('role_id')
# 用户表更新
query = models.UserInfo.objects.filter(id=pk)
query.update(**form.cleaned_data)
obj = query.first()
obj.rl.set(role_id) return redirect('/users.html')
else:
print(form.errors)
return render(request, 'edit_user.html', {'form': form})

Form类

创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

1.Django内置字段如下:

Field
required=True, 是否允许为空
widget=None, HTML插件
label=None, 用于生成Label标签或显示内容
initial=None, 初始值
help_text='', 帮助信息(在标签旁边显示)
error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
validators=[], 自定义验证规则
localize=False, 是否支持本地化
disabled=False, 是否可以编辑
label_suffix=None Label内容后缀 CharField(Field)
max_length=None, 最大长度
min_length=None, 最小长度
strip=True 是否移除用户输入空白 IntegerField(Field)
max_value=None, 最大值
min_value=None, 最小值 FloatField(IntegerField)
... DecimalField(IntegerField)
max_value=None, 最大值
min_value=None, 最小值
max_digits=None, 总长度
decimal_places=None, 小数位长度 BaseTemporalField(Field)
input_formats=None 时间格式化 DateField(BaseTemporalField) 格式:2015-09-01
TimeField(BaseTemporalField) 格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12 DurationField(Field) 时间间隔:%d %H:%M:%S.%f
... RegexField(CharField)
regex, 自定制正则表达式
max_length=None, 最大长度
min_length=None, 最小长度
error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'} EmailField(CharField)
... FileField(Field)
allow_empty_file=False 是否允许空文件 ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype="multipart/form-data"
- view函数中 obj = MyForm(request.POST, request.FILES) URLField(Field)
... BooleanField(Field)
... NullBooleanField(BooleanField)
... 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二次筛选 ModelMultipleChoiceField(ModelChoiceField)
... django.forms.models.ModelMultipleChoiceField TypedChoiceField(ChoiceField)
coerce = lambda val: val 对选中的值进行一次转换
empty_value= '' 空值的默认值 MultipleChoiceField(ChoiceField)
... TypedMultipleChoiceField(MultipleChoiceField)
coerce = lambda val: val 对选中的每一个值进行一次转换
empty_value= '' 空值的默认值 ComboField(Field)
fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式
fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) MultiValueField(Field)
PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用 SplitDateTimeField(MultiValueField)
input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
required=True,
widget=None,
label=None,
initial=None,
help_text='' GenericIPAddressField
protocol='both', both,ipv4,ipv6支持的IP格式
unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用 SlugField(CharField) 数字,字母,下划线,减号(连字符)
... UUIDField(CharField) uuid类型
...

2.Django内置插件

TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget

实例:

 - 常用插件

             class RegisterForm(Form):
name = fields.CharField(
widget=widgets.TextInput(attrs={'class': 'c1'})
)
email = fields.EmailField(
widget=widgets.EmailInput(attrs={'class':'c1'})
)
phone = fields.CharField(
widget=widgets.Textarea(attrs={'class':'c1'})
)
pwd = fields.CharField(
widget=widgets.PasswordInput(attrs={'class':'c1'})
)
pwd_confirm = fields.CharField(
widget=widgets.PasswordInput(attrs={'class': 'c1'})
)
# 单选:select
# city = fields.ChoiceField(
# choices=[(0,"上海"),(1,'北京')],
# widget=widgets.Select(attrs={'class': 'c1'})
# )
# 多选:select
# city = fields.MultipleChoiceField(
# choices=[(1,"上海"),(2,'北京')],
# widget=widgets.SelectMultiple(attrs={'class': 'c1'})
# ) # 单选:checkbox
# city = fields.CharField(
# widget=widgets.CheckboxInput()
# ) # 多选:checkbox
# city = fields.MultipleChoiceField(
# choices=((1, '上海'), (2, '北京'),),
# widget=widgets.CheckboxSelectMultiple
# ) # 单选:radio
# city = fields.CharField(
# initial=2,
# widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
# ) 注意:写默认值时,多选值对应列表 # form = RegisterForm(initial={'city':[1,2],'name':'alex'})
form = RegisterForm() 实例

Django基础之Form表单验证的更多相关文章

  1. 第三百一十一节,Django框架,Form表单验证

    第三百一十一节,Django框架,Form表单验证 表单提交 html <!DOCTYPE html> <html lang="en"> <head& ...

  2. [php基础]PHP Form表单验证:PHP form validator使用说明

    在PHP网站开发建设中,用户注册.留言是必不可少的功能,用户提交的信息数据都是通过Form表单提交,为了保证数据的完整性.安全性,PHP Form表单验证是过滤数据的首要环节,PHP对表单提交数据的验 ...

  3. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  4. the django travel three[form表单验证]

    一:表单验证: 场景:因为浏览器的js可以被禁用,所以需要做后台的输入合法的验证. A:ajax发请求.需要注意的是ajax POST的数据的key值和form表单的里的字段名字一致,否则得不到验证! ...

  5. 九 Django框架,Form表单验证

    表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. Django基础之form表单

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

  7. Django基础之form表单的补充进阶

    1. 应用Bootstrap样式 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  9. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

随机推荐

  1. 添加SAP_ALL权限

    更新usr04,ust04,usrbf2这三张表 REPORT ZTESTCREATEUSER. data: l_USR04 LIKE USR04 , l_UST04 LIKE UST04 , l_P ...

  2. 私有npm下载资源

    私有npm库下载资源需要用户名和密码,这个需要创建npm库的人提供. 使用方法: npm login --registry=仓库地址 Username: 用户名 Password: 密码 Email: ...

  3. [转]ubuntu16.04安装teamviewer12依赖包解决

    安装teamviewer下载地址:http://www.teamviewer.com/en/download/linux/ 下载的是:teamviewer_12.0.76279_i386.deb   ...

  4. WPF中的StackPanel、WrapPanel、DockPanel(转)

    一.StackPanel StackPanel是以堆叠的方式显示其中的控件 1.可以使用Orientation属性更改堆叠的顺序 Orientation="Vertical" 默认 ...

  5. SQL Server 08版与14版处理重复行的方式

    在项目中,利用循环拼接成了插入多行数据的SQL语句: Insert into table(col1,col2)vaules(value11,value21); Insert into table(co ...

  6. linux 链接的使用 创建和删除符号连接

    1 . 使用方式 :ln [option] source_file dist_file                     -f 建立时,将同档案名删除.                     ...

  7. mybatis-动态sql2

    mybatis的动态sql中常用的有    if     where      foreach    set 项目沿用之前的. 1.dao层添加接口: package com.java1234.map ...

  8. Codeforces 802I Fake News (hard)

    Codeforces 802I 题意:统计所有不同子串出现次数的平方的和. 想法:建一个SAM,$Ans=\sum (step[i]-step[fa[i]])*right[i]^2$ #include ...

  9. IOS 旋转+缩放(手势识别)

    @interface NJViewController ()<UIGestureRecognizerDelegate> @property (weak, nonatomic) IBOutl ...

  10. hdu-3371 Connect the Cities---kruskal

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目大意: 给n个城市,m条路,k组已知路,求最小费用联通所有城市: 解题思路: kruska ...