Django Form (上)

简介:

我们已经知道了在Django里面如何从前端向后台发送数据的基本操作。( http://beanxyz.blog.51cto.com/5570417/1944978 )在之前的例子里面,我们的HTML模板里面的form表单都是手动创建的,对于提交的数据类型格式也需要自己写正则表达式进行确认。(例如AJAX的例子http://beanxyz.blog.51cto.com/5570417/1951021  )


如果表单很多的话,手动处理这些东西会很费时间。Django提供了一个form的功能,可以根据我们定义的类,自动生成HTML界面,同时还能对输入的数据自动进行验证,如果失败,可以直接返回错误信息到界面上。


基本操作:

首先需要创建一个form的类,这个里面可以定义字段,每个字段本身只做认证;然后通过字段里的widget这个插件,可以生成对应的HTML和绑定各种style等属性;这样在html界面直接调用对应的`obj`.`id`就行了


直接看个例子说明一下

views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
######################## Form #####################
from  django  import  forms
from  django.forms  import  widgets
from  django.forms  import  fields
class  FM(forms.Form):
     # 字段本身只做验证
     # 如果不配置widget插件,默认就是text显示
     # label显示名字
     user  =  fields.CharField(
         error_messages = { 'required' '用户名不能为空.' },
         label = "用户名 " ,
         )
     pwd  =  fields.CharField(
         max_length = 12 ,
         min_length = 6 ,
         error_messages = { 'required' '密码不能为空.' 'min_length' '密码长度不能小于6' "max_length" '密码长度不能大于12' },
         widget = widgets.PasswordInput(attrs = { 'class' 'c2' }),
         label = "密码" ,
     )
     email  =  fields.EmailField(error_messages = { 'required' '邮箱不能为空.' , 'invalid' : "邮箱格式错误" },label = 'Email' )
     
     #上传文件,注意视图函数和form表单中的使用
     =  fields.FileField(label = '文件' )
 
   
     #单选框
     city1  =  fields.ChoiceField(
         choices = [( 0 , '上海' ),( 1 , '广州' ),( 2 , '东莞' )]
     )
     
     #多选框
     city2  =  fields.MultipleChoiceField(
         choices = [( 0 , '上海' ),( 1 , '广州' ),( 2 , '东莞' )]
     )
 
     
from  app01  import  models
def  fm(request):
     if  request.method  = =  "GET" :
         # 假设下面的值从数据库中获取到
         dic  =  {
             "user" 'r1' ,
             'pwd' '123123' ,
             'email' 'sdfsd@jklsl.com' ,
             'city1' 1 ,
             'city2' : [ 1 , 2 ]
         }
         
         #通过inital来指定一个字典为初始值,字典的key名字要匹配
         obj  =  FM(initial = dic)
         return  render(request, 'fm.html' ,{ 'obj' : obj})
     elif  request.method  = =  "POST" :
         # 获取用户所有数据
         # 每条数据请求的验证
         # 成功:获取所有的正确的信息
         # 失败:显示错误信息
         
         #如果没有上传文件的话,可以直接使用 obj=FM(request.POST)
         obj  =  FM(request.POST,request.FILES)
         r1  =  obj.is_valid()
         if  r1:
             # obj.cleaned_data是正确的提交结果
             print (obj.cleaned_data)
             
             #下列代码是上传一个文件
             import  os
             print (request.FILES[ 'f' ])
             name = request.FILES[ 'f' ]
             file_path  =  os.path.join( 'upload' , str (name) )
             print (file_path)
             =  open (file_path, mode = "wb" )
             for  in  request.FILES[ 'f' ].chunks():
                 f.write(i)
             f.close()
             from  django.core.files.uploadedfile  import  InMemoryUploadedFile
             #如果需要创建数据,可以直接传入
             # models.UserInf.objects.create(**obj.cleaned_data)
         else :
             # ErrorDict,显示错误信息。因为错误信息是字典格式,所以可以通过as_json显示
             print (obj.errors.as_json())
             #具体的错误信息
             # print(obj.errors['email'][0])
             return  render(request, 'fm.html' , { 'obj' : obj})
         return  render(request, 'fm.html' )


fm.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
< html  lang = "en" >
< head >
     < meta  charset = "UTF-8" >
     < title ></ title >
</ head >
< body >
     < form  action = "/fm/"  method = "POST"  enctype = "multipart/form-data" >
         {% csrf_token %}
         < p >{{ obj.user.label }} {{ obj.user }} < span  style = "color:red" >{{ obj.errors.user.0 }}</ span ></ p >
         < p >{{ obj.pwd.label }}{{ obj.pwd }}  < span  style = "color:red" >{{ obj.errors.pwd.0 }}</ span ></ p >
         < p >{{ obj.email.label }}{{ obj.email }} < span  style = "color:red" >{{ obj.errors.email.0 }}</ span ></ p >
         < p >{{ obj.f.label }}{{ obj.f }} < span  style = "color:red" >{{ obj.errors.f.0 }}</ span ></ p >
         {{ obj.city1 }}
         {{ obj.city2 }}
         < input  type = "submit"  value = "提交"  />
     </ form >
</ body >


控制台输出效果

1
2
{ "email" : [{ "message" "\u90ae\u7bb1\u683c\u5f0f\u9519\u8bef" "code" "invalid" }]}
{ "pwd" : [{ "message" "\u5bc6\u7801\u957f\u5ea6\u4e0d\u80fd\u5c0f\u4e8e6" "code" "min_length" }]}



浏览器效果如下:(浏览器会自动生成一堆验证效果,不同的浏览器效果还不一样)

wKioL1myNu7iBHfrAAAf5oVoNF4635.png


上传的结果


wKioL1nMlBPwoEfYAAALzsRcEPw728.png

具体的语法可以参考

http://www.cnblogs.com/wupeiqi/articles/6144178.html






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1963702,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
数据库 开发者 UED
如何使用Django的Form组件
如何使用Django的Form组件
27 0
|
9月前
|
数据库 数据安全/隐私保护 Python
|
9月前
|
Python
|
11月前
|
存储 前端开发 JavaScript
Django第4步_理解form表单类与处理html的post、get
Django第4步_理解form表单类与处理html的post、get
58 0
|
前端开发 数据库 Python
Django Web 极简教程(六)- Django Form(Part A)
Django Web 极简教程(六)- Django Form(Part A)
Django Web 极简教程(六)- Django Form(Part A)
|
存储 SQL 前端开发
Django Blog | 10 自定义Form,美化页面并实现文章编辑功能
Django Blog | 10 自定义Form,美化页面并实现文章编辑功能
381 0
Django Blog | 10 自定义Form,美化页面并实现文章编辑功能
|
前端开发 JavaScript 数据库
Django中的Form组件
一、form组件的主要功能: 生成页面的HTML标签及样式 对用户提交的数据进行校验 自动生成错误信息 保留上次输入信息 二、使用form组件实现注册功能 1、在Django项目下创建一个文件夹,在文件夹中创建一个朋友文件,名字随便起,之后在py文...
1329 0
|
JavaScript 前端开发 Python
Django中ajax技术和form表单两种方式向后端提交文件
一、Form表单方式提交: form表单提交文件或者图像时需要对form中的属性进行如下设置: 1、method="post" //提交方式 post 2、enctype="multipart/form-data" //不对字符编码。
1909 0
|
Web App开发 前端开发 数据安全/隐私保护
Django之路——9 Django的form组件的信息校验
forms组件 校验字段功能 针对一个实例:注册用户讲解。 模型:models.py class UserInfo(models.Model): name=models.
1515 0
|
Python 安全
Django在form提交CSRF验证失败. 相应中断问题
CSRF验证失败. 相应中断. 1).首先,我们可以先看一下出现问题的所在的原因。 Your browser is accepting cookies. The view function passes a request to the template's render method.
1697 0