博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django Form (上)
阅读量:7191 次
发布时间:2019-06-29

本文共 3740 字,大约阅读时间需要 12 分钟。

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

如果表单很多的话,手动处理这些东西会很费时间。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"
}]}

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

上传的结果

具体的语法可以参考

本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1963702,如需转载请自行联系原作者
你可能感兴趣的文章
java基础---面向对象
查看>>
oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
查看>>
textview第一次出现不可滚动文本,但是点击出现键盘,键盘落下,就可以滚动问题...
查看>>
Android小感悟-重写textview组件感悟
查看>>
bnu Game 博弈。
查看>>
【转】IntelliJ IDEA2016.1 + maven 创建java web 项目
查看>>
微软宣布支持基于虚拟机的Azure IOT Edge服务
查看>>
以流动债务为例论指标的合理使用
查看>>
保Cloudera弃Hortonworks,新平台将支持五大云供应商
查看>>
一文教会你数据库性能调优(附某大型医院真实案例)
查看>>
Android - 关于设备版本号
查看>>
听说你Binder机制学的不错,来面试下这几个问题(一)
查看>>
前端测试:Part II (单元测试)
查看>>
ssh整合问题总结--运行项目时报java.lang.StackOverflowError(堆栈溢出)异常
查看>>
.NET中的repeater简介及分页效果
查看>>
基于MVP架构设计ASP.Net的应用研究
查看>>
在Linux系统中安装LNMP出现的错误总结
查看>>
9.4. import your signed certificate
查看>>
4.3. Module
查看>>
【云栖大会】AliOS Things宣布开源,支持物联网设备快速上云
查看>>