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         
扩展

相关文章: