Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django -- 如何优雅的提交表单

Django -- 如何优雅的提交表单

作者头像
周辰晨
发布于 2020-01-19 11:12:08
发布于 2020-01-19 11:12:08
3.8K00
代码可运行
举报
运行总次数:0
代码可运行

前言

前面的内容我们基本上以 get请求作为例子,那 post请求Django是如何处理的呢?本章内容我们就来介绍Django如何发起和处理 post请求的。


一个简单的表单

就拿我们的Cat类来说,之前新增Cat对象都是通过admin后台或者数据库API来操作,现在我们尝试通过前端页面来添加Cat对象。

模板

首先我们新建一个简单的新增Cat对象的模板,新建 'demo_app/add.html'

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/html"><head>    <meta charset="UTF-8">    <title>add cat</title></head><body>    <form action="{% url 'demo_app:add' %}" method="post">        {% csrf_token %}
        name:<input  name="name"> </br>        age :<input  name="age" ></br>

        <input type="submit" value="submit">    </form>
</body></html>
  • 在html文件中,我们定义了一个Form 表单,提交的这个表单会改变服务端的数据,所以我们将 method="post" ,并且我们将action 设置为 {%url'demo_app:add'%}, 这表明了了我们会像 demo_app/views中的 add方法发送数据。
  • {%csrf_token%} 是Django 用来防止跨站点请求伪造。Django 内部的POST表单都要如此。
视图

我们还要创建一个视图来实现这个新增cat 的功能。将下面的代码添加到 deom_app/views.py 文件中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(request):    if request.method == 'GET':        return render(request, 'demo_app/add.html',{})    if request.method == 'POST':        name = request.POST['name']        age = int(request.POST['age'])        cat = Cat(name=name, age=age)        cat.save()        cats_list = Cat.objects.all()        return render(request,'demo_app/index.html',{'cats_list':cats_list})
  • request.method 表示该请求的方法类型,是 GET 还是 POST,或者其他 如 PUT ,DELETE等类型。 ifrequest.method=='GET':returnrender(request,'demo_app/add.html',{}) 表示如果是GET请求时,则系统跳转到 add 页面(比较简陋)
  • request.POST 是一个类字典对象,让你可以通过关键字的名字获取提交的数据,需要注意的是,返回的值永远是字符串。
  • request.method=='POST'时 (表示 如果是 POST 请求时),则取出请求中的name 和 age 关键字的 数据, 新增对象,并直接返回index页面(list页面)
URL配置

修改 demo_proj/urls.py 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import adminfrom django.conf.urls import includefrom django.urls import path
urlpatterns = [    path('admin/', admin.site.urls),    path('demo_app/', include(('demo_app.urls','demo_app'), namespace='demo_app'))]

修改 demo_app/urls.py 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [    path('', views.index, name='index'),    path('hello/<str:country_name>/', views.hello_country, name='hello'),    path('add/', views.add, name='add'),]
  • 因为我们指定了Form表单的 action{%url'demo_app:add'%},所以要注意include 中的写法,如果 include 方法中 namespace 为其他值,如 demo_app1,那么 action中因为 {%url'demo_app1:add'%}

经过上面的配置,我们就能演示从前端新增cat 对象功能了。我们首先跳转到add 页面

点击提交,页面跳转至 list 页面


Form进阶

功能是实现了,但比较简陋,还不完善。就比如,字段是否必填,字段的长度是否超出最大范围,为避免这样的错误,我们必须对字段进行校验,那么我们就在views.py 文件中加上 校验的业务逻辑代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(request):    if request.method == 'GET':        return render(request, 'demo_app/add.html',{})    elif request.method == 'POST':        name = request.POST['name']        age = int(request.POST['age'])
        # 新增字段校验逻辑        if  name ...:            pass
        else:            pass


        cat = Cat(name=name, age=age)        cat.save()        cats_list = Cat.objects.all()        return render(request,'demo_app/index.html',{'cats_list':cats_list})

这样固然能达到效果,但如果字段很多的话,代码将非常臃肿,弊端很大。Django 为此提出了一种较为简便的方法Form ,Django 中的表单有一下两个作用:

  • 渲染表单模板
  • 验证数据是否合法

下面我们来介绍下他的使用。

  1. 在相应的App下新建 forms.py文件 在 demo_app 目录下新建 froms.py 文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.forms import forms
class AddFrom(forms.Form):    name = forms.CharField(required=True, max_length=10, label='name_form')    age = forms.IntegerField(required=True)
  • name=forms.CharField(required=True,max_length=10,label='name_form')定义了 name这个字段是字符串类型的,且是必填的,最大长度为10, label='name_form' 的作用是渲染html 表单中字段为 namelabelname_form
  • age=forms.IntegerField(required=True) 定义了 age 为个整数类型的字段,且是必填的。
  1. 修改 views.py文件 修改 demo_app/views.py文件(为区分根之前版本的不同,我将之前版本的注释掉,以便比较)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(request):    if request.method == 'GET':        # return render(request, 'demo_app/add.html',{})        form = AddFrom()        return render(request, 'demo_app/add.html',{'form':form})    elif request.method == 'POST':        # name = request.POST['name']        # age = int(request.POST['age'])        # cat = Cat(name=name, age=age)        # cat.save()        # cats_list = Cat.objects.all()        # return render(request, 'demo_app/index.html', {'cats_list': cats_list})        form = AddFrom(request.POST)        if form.is_valid():            name = request.POST['name']            age = int(request.POST['age'])            cat = Cat(name=name, age=age)            cat.save()            cats_list = Cat.objects.all()            return render(request,'demo_app/index.html',{'cats_list':cats_list})
  • 当请求是 GET 请求时,新建了一个 AddFrom 实例,并将它作为上下文传递给前端,这样就达到了渲染表单的效果。
  • 当请求是 POST请求时,我们再次创建了一个 AddFrom 实例 并用请求数据填充它 form=AddFrom(request.POST) ,我们称作为 数据绑定表单。
  • form.is_valid() 表示对POST请求中的数据按照当时定义表单字段时定义的规则校验。如 age=forms.IntegerField(required=True) 就会对 请求中的 nage 为 age 的字段进行校验,判断它是否为必填(是否传了),只有所有字段都通过校验后才能进行下面的逻辑。
  • 这边代码只是 演示作用,没有写 is_valid()不通过的情况,代码可以大家继续完善。
  1. 修改模板文件 修改 templates/dem_app/add.html文件,(为区分根之前版本的不同,我将之前版本的注释掉,以便比较)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/html"><head>    <meta charset="UTF-8">    <title>add cat</title></head><body>    <form action="{% url 'demo_app:add' %}" method="post">        {% csrf_token %}        {{ form }}        {#        name:<input  name="name"> </br>#}        {#    age : <input  name="age" ></br>#}

        <input type="submit" value="submit">    </form>
</body></html>
  • 修改过后的我们可以看到,在 <form>标签中,只有 {{form}}了,这就是 渲染表单模板 的作用

我们运行程序可以到同样的效果,大家也可以试试当输入的 nameage不符合条件的情况系统会是什么反应。

我们一般推荐不用表单渲染,因为样式不受自己控制,另外当我们 is_valid()返回true 后,我们可以通过 cleaned_data属性中找到所有通过验证的表单数据,这个大家可以自己探索下。

前文回顾
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师影响力 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文读懂支持向量机SVM(附实现代码、公式)
支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问题,不得不说确实完美。
数据派THU
2018/07/30
6.6K1
一文读懂支持向量机SVM(附实现代码、公式)
【机器学习与实现】支持向量机SVM
图中深蓝色线便是决策边界,也称分离超平面;两条虚线之间宽度叫做间隔 (margin)。支持向量机的优化目标为——间隔最大化。
Francek Chen
2025/01/23
2740
【机器学习与实现】支持向量机SVM
机器学习十大经典算法之支持向量机
在分类问题中,除了线性的逻辑回归模型和非线性的深度神经网络外,我们还可以应用一种被广泛应用于工业界和学术界的模型——支持向量机(SVM),与逻辑回归和神经网络相比,支持向量机在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。支持向量机相对于神经网络和逻辑回归,特别擅长于特征维数多于样本数的情况,而小样本学习至今仍是深度学习的一大难题。
墨明棋妙27
2022/09/23
6950
Andrew Ng机器学习课程笔记--week7(SVM)
本周主要学习SVM 一、 内容概要 Large Margin Classification Optimization Objective(优化Objective(损失函数)) Large Margin Intuition(大边距的直观理解) Mathematics Behind Large Magin Classification(最大间距分类器背后的数学推导) Kernels Kernels 1 Kernels 2 SVMs in Practice Using An SVM 二、重点&难点 1. L
marsggbo
2018/01/23
6400
Andrew Ng机器学习课程笔记--week7(SVM)
机器学习:支持向量机SVM
,代价图像如上图左所示,我们的优化目标是使得代价函数尽量的小,在图中可以看出,当
Here_SDUT
2022/09/19
7340
机器学习:支持向量机SVM
第十三章 支持向量机
到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所使用的数据量。这就体现你使用这些算法时的技巧了,比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。
tomas家的小拨浪鼓
2019/03/15
6470
第十三章 支持向量机
图解机器学习 | 支持向量机模型详解
教程地址:http://www.showmeai.tech/tutorials/34
ShowMeAI
2022/03/10
1.1K0
图解机器学习 | 支持向量机模型详解
Python机器学习的练习六:支持向量机
在这个练习中,我们将使用支持向量机(SVMs)创建一个垃圾邮件分类器。在一些简单的2D数据集上使用SVMs去观察他们如何工作,接下来我们查看一组邮件数据集,并且在处理过的邮件上使用SVMs创建一个分类器,用于判断他们是否是垃圾邮件。 尽管在多类场景中有使用SVMs的方法,但它是一种默认的二进制分类工具。SVMs还可以使用 kernel trick 来处理非线性分类,在尝试找到超平面之前,将数据投射到高维空间中。SVMs是一种强大的算法类,经常用于实际的机器学习应用程序。 首先要做的就是研究简单的二维数据集,
AiTechYun
2018/03/02
1.3K0
Python机器学习的练习六:支持向量机
R语言与机器学习(分类算法)支持向量机
说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”。不过我还是打算写写SVM的基本想法与libSVM中R的接口。 一、SVM的想法 回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢? 要回答这个问题,我们首先必须思考如何确定点的代表性?我想
机器学习AI算法工程
2018/03/12
1.2K0
R语言与机器学习(分类算法)支持向量机
支持向量机核技巧:10个常用的核函数总结
支持向量机是一种监督学习技术,主要用于分类,也可用于回归。它的关键概念是算法搜索最佳的可用于基于标记数据(训练数据)对新数据点进行分类的超平面。
deephub
2023/02/01
1.9K0
详解机器学习中的梯度消失、爆炸原因及其解决方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/details/78847691
DoubleV
2018/09/12
5.3K0
详解机器学习中的梯度消失、爆炸原因及其解决方法
机器学习系列:(九)从感知器到支持向量机
从感知器到支持向量机 上一章我们介绍了感知器。作为一种二元分类器,感知器不能有效的解决线性不可分问题。其实在第二章,线性回归里面已经遇到过类似的问题,当时需要解决一个解释变量与响应变量存在非线性关系的问题。为了提高模型的准确率,我们引入了一种特殊的多元线性回归模型,多项式回归。通过对特征进行合理的组合,我们建立了高维特征空间的解释变量与响应变量的线性关系模型。 随着特征空间的维度的不断增多,在用线性模型近似非线性函数时,上述方法似乎依然可行,但是有两个问题不可避免。首先是计算问题,计算映射的特征,操纵高维的
小莹莹
2018/04/23
1.3K0
机器学习系列:(九)从感知器到支持向量机
机器学习-支持向量机SVM算法
支持向量机(Support Vector Machine, SVM)对监督学习下二分类问题提供了一个绝妙的解决方案。通过对偶函数和核函数求解,将适用范围从二维线性推广到多维非线性模型,使用相关方法变形,也可用于多分类问题和回归问题。
唔仄lo咚锵
2023/05/23
5870
机器学习-支持向量机SVM算法
支持向量机(Support Vector Machines,SVM)
线性可分SVM学习方法,对线性不可分训练数据是不适用的,怎么将它扩展到线性不可分,需要修改硬间隔最大化,使其成为软间隔最大化。
Michael阿明
2020/07/13
2K1
支持向量机(Support Vector Machines,SVM)
机器学习中最流行的模型之一,用于分类的支持向量机的完整介绍
支持向量机(SVM)是一个非常强大而多变的机器学习模型,能够执行线性或非线性的分类,回归,甚至异常值检测。它是机器学习中最流行的模型之一,任何对机器学习感兴趣的人都应该学习和使用它。SVM特别适用于复
AiTechYun
2018/03/05
2.8K0
机器学习中最流行的模型之一,用于分类的支持向量机的完整介绍
机器学习算法|支持向量机(Support Vector Machine,SVM)
机器学习(MachineLearning),作为计算机科学的子领域,是人工智能领域的重要分支和实现方式。
阿巴阿巴-
2025/03/03
1.4K0
如何用Python实现支持向量机(SVM)
SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集。 SVM算法的数学原理相对比较复杂,好在由于SVM算法的研究与应用如此火爆,CSDN博客里也有大量的好文章对此进行分析,下面给出几个本人认为讲解的相当不错的: 支持向量机通俗导论(理解SVM的3层境界):http://blog.csdn.net/v_july_v/article/details/7624837 JULY大牛讲的是如此详细,由浅入深层层推进,以至于关于SVM的原理,我一个字都不想写了。。强烈推荐。 还有一个
机器学习AI算法工程
2018/03/13
1.7K0
如何用Python实现支持向量机(SVM)
机器学习算法Python实现
目录 一、线性回归 1、代价函数 2、梯度下降算法 3、均值归一化 4、最终运行结果 5、使用scikit-learn库中的线性模型实现 二、逻辑回归 1、代价函数 2、梯度 3、正则化 4、S型函数(即) 5、映射为多项式 6、使用的优化方法 7、运行结果 8、使用scikit-learn库中的逻辑回归模型实现 逻辑回归_手写数字识别_OneVsAll 1、随机显示100个数字 2、OneVsAll 3、手写数字识别 4、预测 5、运行结果 6、使用scikit-learn库中的逻辑回归模型实现 三、BP
企鹅号小编
2018/01/09
2.3K0
机器学习算法Python实现
Python3《机器学习实战》学习笔记(九):支持向量机实战篇之再撕非线性SVM
版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 https://blog.csdn.net/c406495762/article/details/78158354
Jack_Cui
2019/05/25
8240
Python3《机器学习实战》学习笔记(九):支持向量机实战篇之再撕非线性SVM
机器学习18:支持向量机(SVM)模型
SVM的推导过程的基本是对线性可分的样本空间的推导,后面的核函数是对线性不可分样本空间的推广,而松弛变量的引进是为了解决噪声(Outliers,异常值)的问题。所以这片文章着重对线性可分情形进行公式推导,后面有空闲时间在对核函数和松弛变量部分进行公式推导的补充。
用户5473628
2019/08/08
5260
机器学习18:支持向量机(SVM)模型
推荐阅读
相关推荐
一文读懂支持向量机SVM(附实现代码、公式)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验