Django入门教程(八)Form表单
有时候我们需要在前台用 get 或 post 方法提交一些数据,所以需要用到 html 表单的知识。
1、创建项目,选择File–>New project–>Django
①根据个人需要,选择相关设置:
②同时创建app
2、查看settings.py文件,会发现app的注册和templates文件夹的路径都已经配置好了。比我们使用命令行创建的较方便一点。
3、在urls.py写入如下路由
4、比如我们需要写一个计算 a和 b 之和的简单应用,网页中应该这么写。在templates文件夹下新建一个index.html的文件。并写入如下代码:
这里我们定义了一个form表单,action指向了提交的地址。同时设置了两个输入框,请求类型是get请求,以及一个提交按钮。
{% url 'form' %}表示引用name="form"的路由地址,上一篇文章已经讲到。
5、编写业务逻辑,
def index(request):return render(request, template_name='index.html')def form(request):'''计算form表单中a和b相加之后的值。:param request::return:'''a = request.GET.get('a','')b = request.GET.get('b', '')return HttpResponse('结果是:{}'.format(int(a) + int(b)))
网页的值传到服务器是通过 标签中的 name 属性来传递的。
在服务器端这么接收:a = request.GET.get(‘a’, ‘’)
request.GET 可以看成一个字典,用GET方法传递的值都会保存到其中,可以用 request.GET.get(‘a’, ‘’)来取值,没有时设置一个默认值,这样不会不报错。
6、访问index首页,其页面效果是这样的
此时我们输入两个数,点击计算按钮,
点击了计算,数据提交到form/这个路由进行运算,得出结果
从上图我们可以观察到,此时的url是# 此时的url地址:form/?a=5&b=3,说明form表单的get请求地址也是通过?&进行连接的。
7、细心额同学就会发现比如我们输入的不是数字,而是字母,就会报错了。
8、Django为我们考虑到了这些问题。
Django框架的form表单,除了提供基本的请求,还提供了一套用于验证input中填写的数据是否合法。比如:要求填写的数字,但是填写的是字母,就会被django中的form的验证机制识别为数据不合法。数据是否合法指的是form预先设定的类型或者是数据长度是否和输入的数据类型和长度保持一致。
①、要使用django框架的表单,首先我们需要在formtest这个app下创建一个forms.py文件。在这个文件中,可以实现form表单的定制。
注意:forms.py文件名是固定的,不能修改。
②编写代码
from django import forms
class CustomForm(forms.Form):a=forms.IntegerField()b=forms.IntegerField()
③ 修改我们的views.py文件,当加载到form表单时,需要将我们定制的CustomForm这个表单,渲染到index.html中。
from .forms import CustomForm
def index(request):form = CustomForm() #实例化类的对象return render(request, template_name='index.html', context={'form': form})
④、修改index.html的内容
⑤、刷新显示
细心的童鞋就会发现,只有两个input输入框。没有form表单,以及提交按钮。
注意:
a、form标签和button按钮还需要自己去设置。
b、自定义表单只生成input标签 。
对此我们再对index.html稍作修改:
刷新查看:
这就构成了我们想要的form表单结构。对比之前我们写的form表单,发现django生成的form表单多出了一个label标签。那么这个label是干什么的呢?
注意:
一般label和input都是成对出现的。
label主要起到了定位光标的作用(即点击A会定位到A的输入框)。
label中的for属性需要设置为input标签的id属性值。
⑥此时在填写a和b时,发现不能填写英文字符了,只能输入数字了。
并且不填写时会提示请填写此字段(这个是受到required的限制,其默认值是true)。
9、上面演示了使用get请求提交表单,那么如果表单(CustomForm)是post请求,如何获取参数呢?
①、再次修改index.html文件。添加一个post请求提交的表单。
②、修改业务逻辑。
def form(request):'''计算form表单中a和b相加之后的值。:param request::return:'''if request.method=='GET':a = request.GET.get('a','')b = request.GET.get('b', '')return HttpResponse('结果是:{}'.format(int(a) + int(b)))elif request.method=='POST':form = CustomForm(data=request.POST)if form.is_valid():a=form.cleaned_data['a']b=form.cleaned_data['b']return HttpResponse(a+b)
注释:
form = CustomForm(data=request.POST) # 根据post请求的数据,初始化CustomForm这个表单
#cleaned_data:如果CustomForm表单数据是合法的,那么input标签中的值,都会被放入cleaned_data这个字典中,如果CustomForm表单数据是不合法的,那么cleaned_data字典就不存在。
#在使用cleaned_data之前,一定要通过is_valid()判断数据的合法性,否则cleaned_data这个字典就是不存在的。只有通过is_valid()验证之后,才会生成这个cleaned_data这个字典。
③填写数据
④刷新查看
a、此时会报出一个错误,原因是我们没有添加csrf_token这个标签。
b、csrf_token:主要是为了防止一些跨站请求伪造攻击。
c、每次在刷新页面的时候,django的中间件csrf会动态生成一个隐藏的input,它的value是一个随机字符串,加载到页面源代码里,同时django框架会将这一次生成的随机字符串保存在自己的数据库中。
d、 等form表单发送post请求时,除了表单数据以外,浏览器会自动将这个隐藏的input标签的值也携带上,提交给django后台,django的中间件就会对这个加密的随机字符串和数据库中的进行对比,如果一致,说明是正常的请求,如果不一致,django就会出现403拒绝请求的页面,认为是一个非法的请求。
⑤修改index.html文件,添加csrf_token标签。
⑥再次运行
10、表单的学习就告一段落了。同时也提出了以下问题,望读者思考。
1、同一个视图函数如何处理同一个请求?
2、同一个视图函数如何处理不同的请求?
我们将在下文来解答这个问题。
Django入门教程(八)Form表单相关推荐
- django ajax form表单,Django学习系列之Form表单和ajax(示例代码)
昵 称: 生 日: 性 别: 男 女 地 址: 手 机 号: 邮 箱: [修改] {% csrf_token %}$(\'#js ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(八)-- 添加表单Form
添加表单Form 我们下一步是在页面中添加一个表单,表格中的选中字段将会显示在表单中.提供一个提交按钮 可以对显示的数据进行修改提交. 添加表单到布局单元格中 1.在右侧布局中使用attachForm ...
- layui教程(一) form 表单的提交问题
点击打开表单页面(弹出层形式)如: 父页面打开子页面的代码 layer.open({type:2, //类型为1时可以为html,和代码,为2时页面地址title: title, //弹出层的标题ar ...
- Django框架下的form表单提交数据(及文件)获取的方法
目录 一.文件的提交和获取 1.html代码: 2.django代码: 二.文本的提交和获取 html: urls.py: 编辑 views.py: 编辑 结果: 一.文件的提交和获取 一般思路为 ...
- html5 form表单,html5 教程
2019独角兽企业重金招聘Python工程师标准>>> html5 form表单 html5 教程 html5 form表单表单介绍 1.XHTML中需要放在form之中的诸如inp ...
- django,form表单,数据库增删改查
Django 02 复习: Django下载: 在命令行输入: pip3 install django==1.11.11 在这里不要用最新的3.7,推荐使用3.6/3.5/ ...
- html表单怎么设置编码,form 表单 设置编码和页面编码
var isIE=!!window.ActiveXObject; if(isIE && document.charset!="utf-8")location.rel ...
- ajax 模拟表单提交,Ajax模拟Form表单提交,含多种数据上传
---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...
- 整理的16个有用的jQuery Form(表单)验证教程
表单在每个网站开发者必不可少的组成部份,而最烦繁的也是表单验证部份,借助于jQuery一些现有成熟的插件,可以大大减少我们的开发工作量以及减少很多重复出现的问题 ,这篇文章将整理出非常好的16篇非常有 ...
最新文章
- torch_geometric 笔记: 数据集Cora 简易 GNN
- 2019.6.16完成classstack任务
- 【论文阅读】Learning Traffic as Images: A Deep Convolutional ... [将交通作为图像学习: 用于大规模交通网络速度预测的深度卷积神经网络](1)
- pdo 参数化查询 mysql函数_PDO笔记之参数化查询
- nuxt asyncData extendRoutes nuxtServerInit
- 变量定义类型长度的理解
- matlab fbp fan arc,滤波反投影重建算法(FBP)实现及应用(matlab)
- linux-vi命令
- header元素 footer元素 hgroup元素
- java中的递归算法_java递归算法详解
- [沈航软工教学] 学生项目Coding地址汇总
- SMILES的基本规则
- python更换证件照底色
- 智力题(猜凶手,确定比赛名次)
- java 修改文件编码_java中怎么获取、设置文件编码格式?
- Win11右下角音量图标不见了怎么办
- 如何在Vue.js和ElementUI框架中获取Collapse组件最后选中的值
- [CSAPP]Architecture Lab实验笔记
- PDF格式转换WPS格式如何实现
- 使用 Python 和 Bitly 缩短您的 URL