Django 表单
上手表单处理实例 有时候我们需要在前端用 get 或 post 方法提交一些表单数据。在后端处理数据时,我们需要接受这些数据。本章就来介绍 Django 如何对表单数据进行接收操作的。
为了完成实验,我们先来写一个网页,其中用到 html 表单的知识。首先我们来写一个计算 a 和 b 之和的简单应用。在 learn 的 templates 目录之下,保存一个名为 index.html 的模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!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>
网页的值传到服务器是通过 或者
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.get('a', None) b = request.GET.get('b', None) a = int(a) b = int(b) return HttpResponse(str(a+b))
按照之前的方式,我们修改一下路由:
1 2 3 4 5 6 7 8 9 10 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 文件:
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 21 22 23 24 25 26 27 28 29 30 31 #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:
1 2 3 4 5 6 7 8 9 10 11 <!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 中添加:
1 2 3 4 5 6 7 8 9 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 的插件,使用起来十分方便。