1:From组件的简单使用
1创建From:
1 #导入模块 2 from django import forms 3 from django.forms import fields, widgets # 导入自定制插件 4 5 6 class F1(forms.Form): 7 #自定制插件:widget=widgets.TextInput(attrs={'class': 123})设置属性 8 user = fields.CharField(min_length=3, max_length=18, widget=widgets.TextInput(attrs={'class': 123})) 9 10 age = fields.IntegerField(required=True) 11 email = fields.EmailField(required=True) 12 file = fields.FileField(required=False) 13 # TypedChoiceField ---- coerce=lambda x: int(x)接收的值转换成int类型 14 city = fields.TypedChoiceField(choices=((0, '上海'), (1, '北京'),), initial=1, coerce=lambda x: int(x)) 15 # 多选框 16 hobby = fields.MultipleChoiceField(choices=((0, '000'), (1, '111'), (2, '222'), (3, '333')), initial=(2, 3))
2:函数处理:
1 from app03.form import F1 # 从创建的应用aoo03下导入from文件里的F1 2 3 def F1(reuqest): 4 If request.method==”GET”: 5 F1.obj = F1() #创建FORM组件定义的输入框 6 Return render(request,”html文件”, {“obj”:obj}) #输入框传到前端,错误提示保留数据 7 8 If reqeust.method == “POST”: 9 F1.obj = F1(request.POST) #实例化自定义的FORM组件,接收数据 10 If obj.is_valid(): # is_valid() 验证是否符合定义的正则 11 print("验证成功",obj.cleaned_data) #查看成功数据 12 13 #######这个位置可以扩展数据库验证之类的操作,或者直接使用钩子验证 14 return redirect("http://想去的网址") 15 16 else: 17 print("验证失败",obj.errors) #显示错误的提示 18 Return render(request,”html文件”, {“obj”:obj}) #降错误的提示传给前端 19 20 注意:这里的GET与POST请求实例化FORM类的对象名(这里是obj)最好用一样的,否则会出现提交后输入框消失的情况
3:生成HTML:
1 #上传文件要加上enctype="multipart/form-data" novalidate 2 #不适用浏览器默认错误提示要加上 novalidate 3 4 <form action="/app03/project/" method="POST" enctype="multipart/form-data" novalidate> 5 <p>user:{{ obj.user }} {{ obj.errors.user.0}}</p> 6 <p>age:{{ obj.age }} {{ obj.errors.age.0}}</p> 7 <p>email:{{ obj.email }}{{ obj.errors.email.0}}</p> 8 <p>{{ obj.file }}{{ obj.errors.file.0}}</p> 9 <p>{{ obj.city }}{{ obj.errors.city.0}}</p> 10 <p>{{ obj.hobby }}{{ obj.errors.hobby.0}}</p> 11 <p><input type="submit" value="提交"></p> 12 </form>
2:FROM类常用属性
1:Django常用内置字段:
1 Field 2 required=True, 是否允许为空 3 widget=None, HTML插件 4 label=None, 用于生成Label标签或显示内容 5 initial=None, 初始值 6 help_text='', 帮助信息(在标签旁边显示) 7 error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'} 8 show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直) 9 validators=[], 自定义验证规则 10 localize=False, 是否支持本地化 11 disabled=False, 是否可以编辑 12 label_suffix=None Label内容后缀 13 14 15 CharField(Field) 16 max_length=None, 最大长度 17 min_length=None, 最小长度 18 strip=True 是否移除用户输入空白 19 20 IntegerField(Field) 21 max_value=None, 最大值 22 min_value=None, 最小值 23 24 FileField(Field) 25 allow_empty_file=False 是否允许空文件 26 27 ImageField(FileField) 28 ... 29 注:需要PIL模块,pip3 install Pillow 30 以上两个字典使用时,需要注意两点: 31 - form表单中 enctype="multipart/form-data" 32 - view函数中 obj = MyForm(request.POST, request.FILES) 33 34 35 ChoiceField(Field) 36 ... 37 choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),) 38 required=True, 是否必填 39 widget=None, 插件,默认select插件 40 label=None, Label内容 41 initial=None, 初始值 42 help_text='', 帮助提示 43 44 45 ModelChoiceField(ChoiceField) 46 ... django.forms.models.ModelChoiceField 47 queryset, # 查询数据库中的数据 48 empty_label="---------", # 默认空显示内容 49 to_field_name=None, # HTML中value的值对应的字段 50 limit_choices_to=None # ModelForm中对queryset二次筛选
2:Django内置插件:
1 TextInput(Input) 2 NumberInput(TextInput) 3 EmailInput(TextInput) 4 URLInput(TextInput) 5 PasswordInput(TextInput) 6 HiddenInput(TextInput) 7 Textarea(Widget) 8 DateInput(DateTimeBaseInput) 9 DateTimeInput(DateTimeBaseInput) 10 TimeInput(DateTimeBaseInput) 11 CheckboxInput 12 Select 13 NullBooleanSelect 14 SelectMultiple 15 RadioSelect 16 CheckboxSelectMultiple 17 FileInput 18 ClearableFileInput 19 MultipleHiddenInput 20 SplitDateTimeWidget 21 SplitHiddenDateTimeWidget 22 SelectDateWidget
3:全局钩子,局部钩子
1 1:全局钩子: 2 3 #两个密码校验 4 def clean(self): 5 pwd = self.cleaned_data.get("password") #校验后的name=password属性密码 6 re_pwd = self.cleaned_data.get("again_password") #校验后的name=again_password属性密码 7 if pwd != re_pwd: 8 #如果不一致就添加错误信息返回 9 self.add_error("again_password",ValidationError("两次密码不一致")) 10 else: 11 return self.cleaned_data 12 13 #局部钩子--用户名 14 def clean_username(self): #clean_验证的字段 15 username = self.cleaned_data.get("username") #拿到输入的字段 16 obj_user = models.UserInfo.objects.filter(username = username)#数据库查找这个字段 17 18 if obj_user: #如果存在 19 self.add_error("username",ValidationError("用户名已存在")) 20 else: 21 return username 22 23 24 #局部钩子--手机号去重 25 def clean_phone(self): #clean_验证的字段 26 phone = self.cleaned_data.get("phone") #拿到输入的字段 27 obj_user = models.UserInfo.objects.filter(phone=phone) #数据库查找这个字段 28 # 如果存在 29 if obj_user: 30 self.add_error("phone", ValidationError("手机号已存在")) 31 else: 32 return phone