django表单
django中的表单继承自forms.Form:
主要功能有两个:页面渲染和表单数据验证
一般都是用来做表单验证
如果想从表单接收用户名数据,一般情况下,需要在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>
使用django的表单
一.编写表单类
在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。
(警告:由于浏览器页面是可以被篡改、伪造、禁用、跳过的,所有的HTML手段的数据验证只能防止意外不能防止恶意行为,是没有安全保证的,破坏分子完全可以跳过浏览器的防御手段伪造发送请求!所以,在服务器后端,必须将前端当做“裸机”来对待,再次进行完全彻底的数据验证和安全防护!)
每个Django表单的实例都有一个内置的is_valid()
方法,用来验证接收的数据是否合法。如果所有数据都合法,那么该方法将返回True,并将所有的表单数据转存到它的一个叫做cleaned_data
的属性中,该属性是以个字典类型数据。
上边的表单在前端会渲染成
<label for="your_name">Your name: </label> <input id="your_name" type="text" name="your_name" maxlength="100" required />
一定要注意,它不包含<form>
标签本身以及提交按钮!!!为什么要这样?方便你自己控制表单动作和CSS,JS以及其它类似bootstrap框架的嵌入!
上边只是简单的一个例子,还有很多属性
在class NameForm(forms.Form)中,
属性=forms.类型(参数)
类型和html标签类型的对应关系如下:
1.类型:
1.BooleanField:checkbox
2.CharField:text
3.ChoiceField:select
4.EmailField:email
5.URLField:url
6.DateField:date
7.IntegerField:number
2.参数:
1.required 默认为True,表示该控件不能为空
2.label 控件前面的文本
3.initial 控件的初始化值,相当于value
4.widget 指定控件的小部件
5.error_message 错误时候的文本提示
6.disabled 为True时表示该空间会被禁用
widget小部件:生成到网页上的控件
Textinput:type="text"
Passwordinput:type="paddword"
Numberinput:type="number"
Emailinput:type="email"
URLinput:type="url"
Hiddeninput:type="hidden"
Textarea:<textarea>
CheckboxSelectMultipe:type="checkbox"
RadioSelect:type="radio"
Select:<select>
SelectMultipe:<select multipe>
widget小部件的使用:
属性=forms.CharField(
label="用户",
widget=forms.小部件类型)
属性=forms.CharField(
label="用户",
widget=forms.小部件类型(
attrs={
"html属性值":"值"}))
二.视图函数
# 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方法,接收表单数据,并验证;
- 如果数据合法,按照正常业务逻辑继续执行下去;
- 如果不合法,返回一个包含先前数据的表单给前端页面,方便用户修改。
- form.is_valid()为True,通过验证,为False,未通过验证
- form.cleaned_data,获取表单数据,-字典
通过表单的is_bound
属性可以获知一个表单已经绑定了数据,还是一个空表。
三.模板处理
xxx.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的表单验证功能,比如邮箱地址验证、必填项目验证等等。
表单渲染格式:
不仅可以通过{{ form }}渲染
模板,还有更多的方式:
{{ form.as_table }}
将表单渲染成一个表格元素,每个输入框作为一个<tr>
标签{{ form.as_p }}
将表单的每个输入框包裹在一个<p>
标签内 tags{{ form.as_ul }}
将表单渲染成一个列表元素,每个输入框作为一个<li>
标签
注意:你要自己手动编写<table>
和<ul>
标签。