【Django入坑之路】Form组件

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)) 
View Code

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)最好用一样的,否则会出现提交后输入框消失的情况
View Code

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>
View Code

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二次筛选
View Code

 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
View Code

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
View Code
原文地址:https://www.cnblogs.com/wanghong1994/p/11589913.html