Django的Form主要具有一下几大功能:
- 生成HTML标签
- 验证用户数据(显示错误信息)
- HTML Form提交保留上次提交数据
- 初始化页面显示内容
1、创建Form类、View函数处理
1 from django import forms 2 from django.forms import widgets # widgets插件相关功能,包括了HTMl中INPUT、select、checkbox、radio等等全部标签 3 from django.forms import fields # fields:字段相关功能 4 5 6 class FM(forms.Form): 7 """ 8 下面的所有字段名字必须和前端的变量name的值相同,否则拿不到值 9 字段本身只用作验证的功能,fields负责生成HTML 10 """ 11 user = fields.CharField( 12 error_messages={'required': '用户名不能为空.'}, 13 widget=widgets.Textarea(attrs={'class': 'c1'}), # widget设置表单字段在html页面的类型,attrs给表单标签设置属性 14 label='用户名', 15 initial='root', 16 help_text='请输入用户名(手机号、邮箱)' 17 ) 18 19 pwd = fields.CharField( 20 max_length=12, 21 min_length=6, 22 error_messages={'required': '密码不能为空', 'min_length': '密码长度不能小于6', 'max_length': '密码长度不能大于12'}, 23 widget=widgets.PasswordInput(attrs={'class': 'c2'}), 24 label='密码', 25 ) 26 email = fields.EmailField(error_messages={'required': '邮箱不能为空.', 'invalid': '邮箱格式错误'}) # 自定义错误信息 27 28 f = fields.FileField() 29 30 city = fields.ChoiceField( 31 choices=[(0, '上海'), (1, '北京'), (2, '东莞')] # 每个元组中的第0个元素是前端select标签中的option标签的value属性 32 ) 33 city1 = fields.MultipleChoiceField( 34 choices=[(0, '上海'), (1, '北京'), (2, '东莞')] 35 ) 36 37 38 def fm(request): 39 if request.method == "GET": 40 ''' 41 打开一个新的编辑页面把默认值都获取到:创建个字典,把类中的字段一一写为字典的key,字典的值即为默认值,可以通过models从数据库获取 42 传递对象到前端时加上initial=dic参数即可设置默认值 43 注意:字段名必须和自定义类中的字段一一对应 44 ''' 45 dic = { 46 'user': 'r1', 47 'pwd': '123123', 48 'email': 'asd@asd', 49 'city1': 1, 50 'city2': [1, 2], 51 } 52 obj = FM(initial=dic) 53 return render(request, 'fm.html', {'obj': obj}) # 打开页面,并将表单验证类对象传到html生成表单标签,利用表单类自动创建表单标签 54 elif request.method == "POST": 55 obj = FM(request.POST) # 创建验证表单类,将用户请求POST对象传进Form类中进行表单验证 56 r1 = obj.is_valid() # is_valid方法:对form中每一个字段逐一进行验证,返回验证是否通过的布尔值 57 if r1: 58 print(obj.cleaned_data) # 以字典的形式返回正确信息 59 models.UserInf.objects.create(**obj.cleaned_data) # 利用cleaned_data实现注册 60 else: 61 # print(obj.errors.as_json()) 62 # print(obj.errors['user']) # errors方法包含了所有的错误信息,取值通过字典方式 63 print(obj.errors) 64 return render(request, 'fm.html', {'obj': obj})
2、生成HTML
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form action="/app03/fm/" method="POST"> 9 {% csrf_token %} 10 <p>{{ obj.user.label }} {{ obj.user }} {{ obj.errors.user.0 }} {{ obj.user.help_text }}</p> 11 <p>{{ obj.pwd.label }} {{ obj.pwd }} {{ obj.errors.pwd.0 }}</p> 12 <p>{{ obj.email }} {{ obj.errors.email.0 }}</p> 13 <p><input type="submit" value="提交"></p> 14 15 16 {# <p>{{ obj.f }} {{ obj.errors.f.0 }}</p>#} 17 18 <p>{{ obj.city }}</p> 19 <p>{{ obj.city1 }}</p> 20 </form> 21 </body> 22 </html> 23
1 widget插件设置表单字段在html页面的类型,包括了HTMl中INPUT、select、checkbox、radio等等全部标签 2 3 使用方式:widget=widgets.Textarea() 或widget=forms.Textarea(),推荐第一种写法 4 Textarea(): <textarea>标签类型 5 TextInput():<input>标签类型 6 7 8 attrs给表单标签设置属性,可以给标签元素设置class样式,和input标签的各种type属性 9 pwd = forms.CharField( 10 widget=forms.TextInput(attrs={'type':'password','class':'c1'}), 11 ) 12 13 其他方法: 14 EmailInput、URLInput、PasswordInput等等,如需定制样式直接在后面加对应的属性attrs参数即可 15 widget=widgets.PasswordInput(attrs={'class': 'c2'}) 16