【Django入坑之路】Form组件
2024-09-05 03:41:57
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
最新文章
- nginx端口占用案例分享
- Devexpress GridView 数据格式化显示
- iOS遍历相册中的图片
- 【bzoj3884】 上帝与集合的正确用法
- 第四十三课:jQuery插件化
- outlook新邮件到达提醒设置以及outlook最小化到托盘设置
- Oracle分区表学习
- 编译的时候 c:\windows\assembly\ 卸载不掉
- HTML5 桌面通知:Notification API
- 如何在一个项目中同时包含mvc建站、webapi接口
- linux或Mac中./与/
- sublime text3简体中文版汉化教程
- kafka消息会不会丢失
- cpu_relax
- Redis Cluster(集群)
- WPF DEV gridcontrol 自定义计算列(TotalSummary)
- hdu1002-A + B Problem II-(java大数)
- 安卓程序代写 网上程序代写[原]C语言基础
- iOS开发-JSON解析
- 报表导出jxls的使用笔记
热门文章
- chage 修改用户密码有效期限的命令
- Linux User and Group Management
- CentOS 6.5之zabbix2.2的简单部署
- android搭建
- HTML 语法简要总结
- Ubuntu linux下部署golang配置环境,极客学院 无闻讲的安装配置是错的,折腾我好几遍,真是有点坑
- fastjson 对象和json互转
- 大半夜吃饱了撑的帮人调IE玩
- Struts_登录练习(未配置拦截器)
- git出现“The file will have its original line endings in your working directory”错误