Django 表单
Django 表单
上手表单处理实例
有时候我们需要在前端用 get 或 post 方法提交一些表单数据。在后端处理数据时,我们需要接受这些数据。本章就来介绍 Django 如何对表单数据进行接收操作的。
为了完成实验,我们先来写一个网页,其中用到 html 表单的知识。首先我们来写一个计算 a 和 b 之和的简单应用。在 learn 的 templates 目录之下,保存一个名为 index.html 的模板:
<!DOCTYPE html>
<html>
<body>
<p>Please input 2 numbers:</p>
<form action="/add/" method="get">
a: <input type="text" name="a"> <br>
b: <input type="text" name="b"> <br>
<input type="submit" value="submit">
</form>
</body>
</html>
网页的值传到服务器是通过 或者
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
def add(request):
a = request.GET.get('a', None)
b = request.GET.get('b', None)
a = int(a)
b = int(b)
return HttpResponse(str(a+b))
按照之前的方式,我们修改一下路由:
from django.conf.urls import include, url
from django.contrib import admin
from learn import views as learn_views
from calc import views as calc_views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^index/', learn_views.index),
url(r'^add/$', learn_views.add, name='add'),
]
开始紧张的测试阶段:


其实我们发现,使用 get 方法进行表单提交,相当于通过表单进行 get 传递参数的一种变化形式,其原理与之前的参数传递没有区别。但是通过此方法,可以以界面的方式对参数进行传递,增强了用户体验
接下来我们来看 post 方法。我们直接引入例子来对其进行说明。在 learn 目录中新建一个 forms.py 文件:
from django import forms
class AddForm(forms.Form):
a = forms.IntegerField()
b = forms.IntegerField()
修改一下 views.py 文件:
#coding: utf-8
from django.shortcuts import render
from django.http import HttpResponse
from .forms import AddForm
def index(request):
if request.method == 'POST':
# 当表单以 POST 方式提交的时候
form = AddForm(request.POST)
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})
def home(request):
TutorialList = ["HTML", "css", "jQuery", "Python", "Django"]
return render(request, 'home.html', {'TutorialList': TutorialList})
def add(request):
a = request.GET.get('a', None)
b = request.GET.get('b', None)
a = int(a)
b = int(b)
return HttpResponse(str(a + b))
对应的模板文件 index.html:
<!DOCTYPE html>
<html>
<body>
<p>Please Input 2 numbers:</p>
<form method='post'>
{% csrf_token %}
{{ form }}
<input type="submit" value="submit">
</form>
</body>
</html>
在链接路由 urls.py 中添加:
from django.conf.urls import include, url
from django.contrib import admin
from learn import views as learn_views
from calc import views as calc_views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$', learn_views.index, name='home'),
]
测试一下结果:

很多人觉得这样会变得更麻烦。其实不然,因为 Django 的 forms 提供了好用的几个功能:
- 模板中表单的渲染;
- 数据的验证工作,某一些输入不合法也不会丢失已经输入的数据;
- 还可以定制更复杂的验证工作,如果提供了 10 个输入框,必须要输入其中两个以上等功能,在 forms.py 中实现都是很容易的。
- 另外也有一些将 Django forms 渲染成 Bootstrap 的插件,使用起来十分方便。