1:From组件的简单使用

1创建From:

 #导入模块
from django import forms
from django.forms import fields, widgets # 导入自定制插件 class F1(forms.Form):
#自定制插件:widget=widgets.TextInput(attrs={'class': 123})设置属性
user = fields.CharField(min_length=3, max_length=18, widget=widgets.TextInput(attrs={'class': 123})) age = fields.IntegerField(required=True)
email = fields.EmailField(required=True)
file = fields.FileField(required=False)
# TypedChoiceField ---- coerce=lambda x: int(x)接收的值转换成int类型
city = fields.TypedChoiceField(choices=((0, '上海'), (1, '北京'),), initial=1, coerce=lambda x: int(x))
# 多选框
hobby = fields.MultipleChoiceField(choices=((0, ''), (1, ''), (2, ''), (3, '')), initial=(2, 3))

2:函数处理:

 from app03.form import F1 # 从创建的应用aoo03下导入from文件里的F1

 def F1(reuqest):
If request.method==”GET”:
F1.obj = F1() #创建FORM组件定义的输入框
Return render(request,”html文件”, {“obj”:obj}) #输入框传到前端,错误提示保留数据 If reqeust.method == “POST”:
F1.obj = F1(request.POST) #实例化自定义的FORM组件,接收数据
If obj.is_valid(): # is_valid() 验证是否符合定义的正则
print("验证成功",obj.cleaned_data) #查看成功数据 #######这个位置可以扩展数据库验证之类的操作,或者直接使用钩子验证
return redirect("http://想去的网址") else:
print("验证失败",obj.errors) #显示错误的提示
Return render(request,”html文件”, {“obj”:obj}) #降错误的提示传给前端 注意:这里的GET与POST请求实例化FORM类的对象名(这里是obj)最好用一样的,否则会出现提交后输入框消失的情况

3:生成HTML:

  #上传文件要加上enctype="multipart/form-data"   novalidate
#不适用浏览器默认错误提示要加上 novalidate <form action="/app03/project/" method="POST" enctype="multipart/form-data" novalidate>
<p>user:{{ obj.user }} {{ obj.errors.user.0}}</p>
<p>age:{{ obj.age }} {{ obj.errors.age.0}}</p>
<p>email:{{ obj.email }}{{ obj.errors.email.0}}</p>
<p>{{ obj.file }}{{ obj.errors.file.0}}</p>
<p>{{ obj.city }}{{ obj.errors.city.0}}</p>
<p>{{ obj.hobby }}{{ obj.errors.hobby.0}}</p>
<p><input type="submit" value="提交"></p>
</form>

2:FROM类常用属性

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, 最小值 FileField(Field)
allow_empty_file=False 是否允许空文件 ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype="multipart/form-data"
- view函数中 obj = MyForm(request.POST, request.FILES) 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二次筛选

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

3:全局钩子,局部钩子

 1:全局钩子:

 #两个密码校验
def clean(self):
pwd = self.cleaned_data.get("password") #校验后的name=password属性密码
re_pwd = self.cleaned_data.get("again_password") #校验后的name=again_password属性密码
if pwd != re_pwd:
#如果不一致就添加错误信息返回
self.add_error("again_password",ValidationError("两次密码不一致"))
else:
return self.cleaned_data #局部钩子--用户名
def clean_username(self): #clean_验证的字段
username = self.cleaned_data.get("username") #拿到输入的字段
obj_user = models.UserInfo.objects.filter(username = username)#数据库查找这个字段 if obj_user: #如果存在
self.add_error("username",ValidationError("用户名已存在"))
else:
return username #局部钩子--手机号去重
def clean_phone(self): #clean_验证的字段
phone = self.cleaned_data.get("phone") #拿到输入的字段
obj_user = models.UserInfo.objects.filter(phone=phone) #数据库查找这个字段
# 如果存在
if obj_user:
self.add_error("phone", ValidationError("手机号已存在"))
else:
return phone

最新文章

  1. nginx端口占用案例分享
  2. Devexpress GridView 数据格式化显示
  3. iOS遍历相册中的图片
  4. 【bzoj3884】 上帝与集合的正确用法
  5. 第四十三课:jQuery插件化
  6. outlook新邮件到达提醒设置以及outlook最小化到托盘设置
  7. Oracle分区表学习
  8. 编译的时候 c:\windows\assembly\ 卸载不掉
  9. HTML5 桌面通知:Notification API
  10. 如何在一个项目中同时包含mvc建站、webapi接口
  11. linux或Mac中./与/
  12. sublime text3简体中文版汉化教程
  13. kafka消息会不会丢失
  14. cpu_relax
  15. Redis Cluster(集群)
  16. WPF DEV gridcontrol 自定义计算列(TotalSummary)
  17. hdu1002-A + B Problem II-(java大数)
  18. 安卓程序代写 网上程序代写[原]C语言基础
  19. iOS开发-JSON解析
  20. 报表导出jxls的使用笔记

热门文章

  1. chage 修改用户密码有效期限的命令
  2. Linux User and Group Management
  3. CentOS 6.5之zabbix2.2的简单部署
  4. android搭建
  5. HTML 语法简要总结
  6. Ubuntu linux下部署golang配置环境,极客学院 无闻讲的安装配置是错的,折腾我好几遍,真是有点坑
  7. fastjson 对象和json互转
  8. 大半夜吃饱了撑的帮人调IE玩
  9. Struts_登录练习(未配置拦截器)
  10. git出现“The file will have its original line endings in your working directory”错误