有时候我们需要在前台用 get 或 post 方法提交一些数据,所以自己写一个网页,用到 html 表单的知识。
第一节:源码下载 zqxt_form_learn1.zip
比如写一个计算 a和 b 之和的简单应用,网页上这么写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!DOCTYPE html>
<
html
>
<
body
>
<
p
>请输入两个数字</
p
>
<
form
action
=
"/add/"
method
=
"get"
>
a: <
input
type
=
"text"
name
=
"a"
> <
br
>
b: <
input
type
=
"text"
name
=
"b"
> <
br
>
<
input
type
=
"submit"
value
=
"提交"
>
</
form
>
</
body
>
</
html
>
|
把这些代码保存成一个index.html,放在 templates 文件夹中。
网页的值传到服务器是通过 <input> 或 <textarea>标签中的 name 属性来传递的,在服务器端这么接收:
1
2
3
4
5
6
7
8
9
10
11
12
|
from
django.http
import
HttpResponse
from
django.shortcuts
import
render
def
index(request):
return
render(request,
'index.html'
)
def
add(request):
a
=
request.GET[
'a'
]
b
=
request.GET[
'b'
]
a
=
int
(a)
b
=
int
(b)
return
HttpResponse(
str
(a
+
b))
|
request.GET 可以看成一个字典,用GET方法传递的值都会保存到其中,可以用 request.GET.get('key', None)来取值,没有时不报错。
再将函数和网址对应上,就可以访问了,详情参见源码。
这样就完成了基本的功能,基本上可以用了。
但是,比如用户输入的不是数字,而是字母,就出错了,还有就是提交后再回来已经输入的数据也会没了。
当然如果我们手动将输入之后的数据在 views 中都获取到再传递到网页,这样是可行的,但是很不方便,所以 Django 提供了更简单易用的 forms 来解决验证等这一系列的问题。
第二节,使用 Django 的 表单 (forms)
例子足够简单,但是能说明问题
源码下载:zqxt_forms2.zip
1
2
3
4
|
新建一个 zqxt_form2 项目
django-admin.py startproject zqxt_form2
# 进入到 zqxt_form2 文件夹,新建一个 tools APP
python manage.py startapp tools
|
在tools文件夹中新建一个 forms.py 文件
1
2
3
4
5
|
from
django
import
forms
class
AddForm(forms.Form):
a
=
forms.IntegerField()
b
=
forms.IntegerField()
|
我们的视图函数 views.py 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# coding:utf-8
from
django.shortcuts
import
render
from
django.http
import
HttpResponse
# 引入我们创建的表单类
from
.forms
import
AddForm
def
index(request):
if
request.method
=
=
'POST'
:
# 当提交表单时
form
=
AddForm(request.POST)
# form 包含提交的数据
if
form.is_valid():
# 如果提交的数据合法
a
=
form.cleaned_data[
'a'
]
b
=
form.cleaned_data[
'b'
]
return
HttpResponse(
str
(
int
(a)
+
int
(b)))
else
:
# 当正常访问时
form
=
AddForm()
return
render(request,
'index.html'
, {
'form'
: form})
|
对应的模板文件 index.html
1
2
3
4
5
|
<
form
method
=
'post'
>
{% csrf_token %}
{{ form }}
<
input
type
=
"submit"
value
=
"提交"
>
</
form
>
|
再在 urls.py 中对应写上这个函数
1
2
3
4
5
6
7
8
9
10
|
from
django.conf.urls
import
patterns, include, url
from
django.contrib
import
admin
admin.autodiscover()
urlpatterns
=
patterns('',
# 注意下面这一行
url(r
'^$'
,
'tools.views.index'
, name
=
'home'
),
url(r
'^admin/'
, include(admin.site.urls)),
)
|
新手可能觉得这样变得更麻烦了,有些情况是这样的,但是 Django 的 forms 提供了:
-
模板中表单的渲染
-
数据的验证工作,某一些输入不合法也不会丢失已经输入的数据。
-
还可以定制更复杂的验证工作,如果提供了10个输入框,必须必须要输入其中两个以上,在 forms.py 中都很容易实现
也有一些将 Django forms 渲染成 Bootstrap 的插件,也很好用,很方便。
扩展:如果提交后在同一个页面显示结果呢?请看 Django Ajax