使用表单
假设你想从表单接收用户名数据,一般情况下,你需要在HTML中手动编写一个如下的表单元素:
<form action="/your-name/" method="post"> <label for="your_name">Your name: </label> <input id="your_name" type="text" name="your_name" value="{{ current_name }}"> <input type="submit" value="OK"></form>
<form action="/your-name/" method="post">这一行定义了我们的发送目的地/your-name/和HTTP方法POST。form元素内部还定义了一个说明标签<label>和一个发送按钮‘submit’,以及最关键的接收用户输入的<input>元素。
一、编写表单类
我们可以通过Django提供的Form类来自用生成上面的表单,不再需要手动在HTML中编写。
首先,在你当前app内新建一个forms.py文件(这个套路是Django的惯用手法,就像views.py,models.py等等),然后输入下面的内容:
from django import forms class NameForm(forms.Form): your_name = forms.CharField(label='Your name', max_length=100)
提前导入forms模块所有的表单类都要继承forms.Form类每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的<form>元素中的表单元素。这一点和Django模型系统的设计非常相似。例子中的label用于设置说明标签max_length限制最大长度为100。它同时起到两个作用,一是在浏览器页面限制用户输入不可超过100个字符,二是在后端服务器验证用户输入的长度不可超过100。
每个Django表单的实例都有一个内置的is_valid()方法,用来验证接收的数据是否合法。如果所有数据都合法,那么该方法将返回True,并将所有的表单数据转存到它的一个叫做cleaned_data的属性中,该属性是以个字典类型数据。
当我们将上面的表单渲染成真正的HTML元素,其内容如下:
<label for="your_name">Your name: </label> <input id="your_name" type="text" name="your_name" maxlength="100" required />
二、视图处理
需要在视图中,实例化我们编写好的表单类。
# views.py from django.shortcuts import render from django.http import HttpResponseRedirect from .forms import NameForm def get_name(request): # 如果form通过POST方法发送数据 if request.method == 'POST': # 接受request.POST参数构造form类的实例 form = NameForm(request.POST) # 验证数据是否合法 if form.is_valid(): # 处理form.cleaned_data中的数据 # ... # 重定向到一个新的URL return HttpResponseRedirect('/thanks/') # 如果是通过GET方法请求数据,返回一个空的表单 else: form = NameForm() return render(request, 'name.html', {'form': form})
要点是:
对于GET方法请求页面时,返回空的表单,让用户可以填入数据;
对于POST方法,接收表单数据,并验证;
如果数据合法,按照正常业务逻辑继续执行下去;
如果不合法,返回一个包含先前数据的表单给前端页面,方便用户修改。
通过表单的is_bound属性可以获知一个表单已经绑定了数据,还是一个空表。
三、模板处理
在Django的模板中,我们只需要按下面处理,就可以得到完整的HTML页面:
<form action="/your-name/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit" /> </form>
要点:
<form>…</form>标签要自己写;
使用POST的方法时,必须添加{% csrf_token %}标签,用于处理csrf安全机制;
{{ form }}代表Django为你生成其它所有的form标签元素,也就是我们上面做的事情;
提交按钮需要手动添加!
提示:默认情况下,Django支持HTML5的表单验证功能,比如邮箱地址验证、必填项目验证等等。
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试