Form的作用
许多不同类型的数据可能需要在一张表单中准备显示,渲染成HTML,使用方便的界面进行编辑,传到服务器,验证和清理数据,然后保存或跳过进行下一步处理。
Django 的表单功能可以简化和自动化上述工作的大部分内容,并且也能比大多数程序员自己编写代码去实现来的更安全些。
Django 会处理涉及表单的三个不同部分:
- 准备并重组数据,以便下一步的渲染
- 为数据创建HTML 表单
- 接收并处理客户端提交的表单及数据
Django表单系统的核心组件是
Form
类。…Form
类描述一张表单并决定它如何工作及呈现。
一个简单的例子
将之前自行车的例子修改为通过表单提交 ID,然后显示对应颜色的自行车。
- 修改 bicycle/urls.py :
from django.urls import path
from .views import MyBicycle
urlpatterns = [
path('', MyBicycle.as_view()),
]
- 创建 bicycle/forms.py :
from django import forms
class BicycleIdForm(forms.Form):
bicycle_id = forms.IntegerField(
label='Bicycle ID',
min_value=1,
max_value=3
)
- 修改 bicycle/views.py (这次我们没有使用 csrf_exempt 装饰器):
from django.template.response import TemplateResponse
from django.views import View
from .forms import BicycleIdForm
class MyBicycle(View):
color = {
1: 'yellow',
2: 'red',
3: 'blue'
}
def get(self, request):
form = BicycleIdForm()
return TemplateResponse(request, 'bicycle.html', {'form': form})
def post(self, request):
form = BicycleIdForm(request.POST)
context = {'form': form}
if form.is_valid():
context['color'] = self.color[form.cleaned_data['bicycle_id']]
return TemplateResponse(request, 'bicycle.html', context)
- 修改 bicycle/templates/bicycle.html :
{% extends "base.html" %}
{% block title %}My bicycle{% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
<hr>
{% if color %}
<h2>This is my <span style="color:{{ color }}">{{ color }}</span> bicycle.</h2>
<pre style="color:{{ color }}; font-family:Courier New">
$" *.
d$$$$$$$P" $ J
^$. 4r "
d"b .db
P $ e" $
..ec.. ." *. zP $.zec..
.^ 3*b. *. .P" .@"4F "4
." d" ^b. *c .$" d" $ %
/ P $. "c d" @ 3r 3
4 .eE........$r===e$$$$eeP J *.. b
$ $$$$$ $ 4$$$$$$$ F d$$$. 4
$ $$$$$ $ 4$$$$$$$ L *$$$" 4
4 " ""3P ===$$$$$$" 3 P
* $ """ b J
". .P %. @
%. z*" ^%. .r"
"*==*"" ^"*==*""
</pre>
{% endif %}
{% endblock %}
-
用浏览器打开 http://127.0.0.1:8000/bicycle/ :
-
在表单中输入数字 3 并提交:
-
查看页面源码,可以发现有一个
csrfmiddlewaretoken
的隐藏表单域,起到防止 跨站请求伪造攻击 的作用:
<input type="hidden" name="csrfmiddlewaretoken" value="wxSeUs7PSL...aIrmHhzrsrDaim">
总结
表单的核心功能就是对提交的数据进行校验:无论用表单提交了什么数据,一旦通过调用 is_valid()
验证成功( is_valid()
返回 True
),已验证的表单数据将被放到 form.cleaned_data
字典中。这里的数据已经很好地转化为 Python 类型。
表单的另一个作用是通过模板标记简化 HTML 表单页面的书写。