自强学堂
自强学堂:学习、分享、让你更强!
Django 教程HTMLCSSJAVASCRIPTJQUERYSQLPHPBOOTSTRAPANGULARXML
 

Django 表单

有时候我们需要在前台用 get 或 post 方法提交一些数据,所以自己写一个网页,用到 html 表单的知识。

第一节:

比如写一个计算 a和 b 之和的简单应用,网页上这么写

<!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 属性来传递的,在服务器端这么接收:

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 来解决验证等这一系列的问题。

源码下载:(建议在不同环境下按照上面的说明自己打一遍,所以Python环境,Django版本应该是类似的。

 zqxt_form_learn1.zip (Django 1.4-Django 1.7参考)

zqxt4396.zip 基于 Django 1.11 [更新于 2017-08-25 01:07:41]


第二节,使用 Django 的 表单 (forms)

例子足够简单,但是能说明问题

新建一个 zqxt_form2 项目
django-admin.py startproject zqxt_form2
# 进入到 zqxt_form2 文件夹,新建一个 tools APP
python manage.py startapp tools

在tools文件夹中新建一个 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':# 当提交表单时
    
        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

<form method='post'>
{% csrf_token %}
{{ form }}
<input type="submit" value="提交">
</form>

再在 urls.py 中对应写上这个函数

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)),
)

源码下载:zqxt_forms2.zip


新手可能觉得这样变得更麻烦了,有些情况是这样的,但是 Django 的 forms 提供了:

  1. 模板中表单的渲染

  2. 数据的验证工作,某一些输入不合法也不会丢失已经输入的数据。

  3. 还可以定制更复杂的验证工作,如果提供了10个输入框,必须必须要输入其中两个以上,在 forms.py 中都很容易实现


也有一些将 Django forms 渲染成 Bootstrap 的插件,也很好用,很方便。

扩展:如果提交后在同一个页面显示结果呢?请看 Django Ajax

服务承诺:2017年03月11日到12日出现了网站不可访问,不少同学发来了邮件关心,感谢大家对自强堂Django教程的支持与厚爱。自强学堂不会关闭,我向大家承诺,我依然会坚持每天答疑,看邮件回复邮件,服务器费用已经缴纳三年,后期会努力提高服务稳定性。我也还至少会再坚持做三年,直到2020年03月12日,我愿意坚持做这件事,是因为我认为这很有意义,2015年劳动节开始写这个教程的时候,我没有想到如今,每天会有5000人来自强学堂看Django教程,我希望能帮助到更多的人。—— 2017年03月12日于北京深夜 涂伟忠