Skip to content

Instantly share code, notes, and snippets.

@amelieykw
Last active July 12, 2018 16:38
Show Gist options
  • Save amelieykw/008044e4e5d7781470b3943eb3bde1cb to your computer and use it in GitHub Desktop.
Save amelieykw/008044e4e5d7781470b3943eb3bde1cb to your computer and use it in GitHub Desktop.
[Django Forms 表单] #表单 #Django #forms

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

第一节:

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

  1. 把这些代码保存成一个index.html,放在 templates 文件夹中。
<!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>
  1. 网页的值传到服务器是通过 <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)来取值,没有时不报错。

  1. 再将函数和网址对应上,就可以访问了

这样就完成了基本的功能,基本上可以用了。

BUT

但是,比如用户输入的不是数字,而是字母,就出错了,还有就是提交后再回来已经输入的数据也会没了

当然如果我们手动将输入之后的数据在 views 中都获取到再传递到网页,这样是可行的,但是很不方便,所以 Django 提供了更简单易用的 forms 来解决验证等这一系列的问题。

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

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

  1. 模板中表单的渲染
  2. 数据的验证工作,某一些输入不合法也不会丢失已经输入的数据。
  3. 还可以定制更复杂的验证工作,如果提供了10个输入框,必须必须要输入其中两个以上,在 forms.py 中都很容易实现

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment