Django中Ajax表单提交

Ajax是以一种与服务器交换数据的技术,可以在不重载整个页面的情况下更新网页的一部分。它也可以运用在Django项目的表单中,与普通的views函数不一样的是:表单所在的网页上必须有JavaScript脚本,该脚本一方面对提交数据给view方法,另一方面根据view返回的response对现有的页面进行调整。

下面是一个简单的例子,通过这个例子,总结其步骤和需要注意的地方。

  • 首先是html
# base.html
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title Page</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.3/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- jQuery -->
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- Bootstrap JavaScript -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
{% block body_block %}
{% endblock %}
</body>
</html>
# testAjax.html
{% extends 'base.html' %}
{% block body_block %}
<h4>FeedBack</h4>
<div class="row">
<div id="feedbackmessage">
Hell
</div>
</div>
<form method="POST" id="feedbackform" action='{% url "testapp:feedback" %}'>
{% csrf_token %}
<div class="row">
<div class="col-md-12">
{{ form.comment }}
</div>
</div>
{{ form.name.as_hidden }}
{{ form.email.as_hidden }}
{{ form.gender.as_hidden }}
<input type="submit" value="Submit feedback" class="btn btn-primary">
</form> <script>
$(document).ready(function(){
$('#feedbackform').submit(function(event){
event.preventDefault()
$.ajax({data:$(this).serialize(),
type:$(this).attr('method'),
url:$(this).attr('action'),
success:function(response){
console.log(response);
if (response['success']){
$('#feedbackmessage').html('<div class="alert alert-success"> Successsfully sent feedback</div>');
$('#feedbackform').addClass('hidden');
};
if (response['error']){
$('#feedbackmessage').html("<div class='alert alert-danger'>"+
response['error']['comment']+"</div>");
}
},
error:function (request,status,error){
console.log(request.responseText);
}
})
})
})
</script>
{% endblock %}

这里需要注意的是在JQuery下的Ajax的脚本中,event.preventDefault方法必须要调用,因为这个方法意味着阻止元素发生默认行为(详见https://www.runoob.com/jquery/event-preventdefault.html),如果没有阻止的话,ajax技术就没有办法运用,在提交了表单后,页面直接返回view方法返回的response页面,而不会根据ajax的逻辑来修改页面。(ajax简介:https://www.runoob.com/jquery/jquery-ref-ajax.html

  • url
#主urls.py
from django.contrib import admin
from django.urls import include
from django.urls import path urlpatterns = [
path('admin/', admin.site.urls),
path('testapp/',include('testapp.urls',namespace='testapp')) #定义命名空间 ]
#app中的urls.py
from django.conf.urls import url
from testapp import views
from django.views.generic import TemplateView
app_name='testapp' #定义命名空间
urlpatterns=[
url(r'^testDebug',views.testDebug,name='testDebug'),
url(r'^feedback/$',views.feedback,name='feedback'),
]
  • views.py
def feedback(request):
if request.POST:
form=ContactForm(request.POST)
if form.is_valid():
return JsonResponse({'success':True})
else:
return JsonResponse({'error':form.errors})
form=ContactForm(initial={'email':'784@qq.com','name':'yy','gender':'a'})
return render(request,'testapp/testAjax.html',{'form':form})
  • forms.py
from django import forms
class ContactForm(forms.Form):
name=forms.CharField(required=False)
email=forms.EmailField(label='Your Email')
comment=forms.CharField(widget=forms.Textarea)
gender=forms.ChoiceField(choices=(('a','male'),('b','female'),('c','人妖')))
def clean_name(self):
name=self.cleaned_data.get('name','')
if 'y' not in name:
raise forms.ValidationError('y not in name')
return name

填写,提交后:

Django中文件上传

与普通的view函数及

不一样的是:bound form中还需要传入request.FILES, html中的中还应该有enctype='multipart/form-data',该属性规定在发送到服务器之前应该如何对表单数据进行编码,'multipart/form-data'即不对字符进行编码,在使用包含文件上传控件的表单中必须使用该值。

  • html
{% extends 'base.html' %}
{% block body_block %}
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<ul>
{{ form.as_ul }}
</ul>
<input type="submit" value="submit img/vedio" class="btn btn-primary">
</form>
{% endblock %}
  • forms.py
class SharingForm(forms.Form):
video=forms.FileField()
photo=forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple':True}))
  • views.py
from django.conf import settings
def save_upload_file_to_media_root(f):
with open('%s/%s'%(settings.MEDIA_ROOT,f.name),'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk) def uploadFile(request):
if request.method=='POST':
form=forms.SharingForm(request.POST,request.FILES)
if form.is_valid():
for field in request.FILES.keys():
for formfile in request.FILES.getlist(field):
save_upload_file_to_media_root(formfile)
return HttpResponse('OK,Upload successfully')
else:
form=forms.SharingForm()
return render(request,'banners/upload.html',{'form':form})

效果:

提交:

查看项目下的media文件夹:

Django中的Ajax表单提交与文件上传的更多相关文章

  1. jquery mobile 表单提交 图片/文件 上传

    jquerymobile 下面 form 表单提交 和普通html没区别,最主要是 <form 要加一个 data-ajax='false' 否则 上传会失败 1  html代码 <!do ...

  2. node07---post请求、表单提交、文件上传

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. JavaScript实现form表单的多文件上传

    form表单的多文件上传,具体内容如下 formData对象可以使用一系列的键值对来模拟一个完整的表单,然后使用Ajax来发送这个表单 使用<form>表单初始化FormData对象的方式 ...

  4. 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME

    原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...

  5. [Nginx 2] form表单提交,图片上传

    导读:昨晚恶补了一些Nginx服务器的东西,从整体上对Nginx有一个初步的了解.上午去找师哥问了问目前项目中的使用情况,然后就开始上传图片了.这里就简单总结整理一下今天的成果,以后接着提升.简单粗暴 ...

  6. 基于hi-nginx的web开发(python篇)——表单处理和文件上传

    hi-nginx会自动处理表单,所以,在hi.py框架里,要做的就是直接使用这些数据. 表单数据一般用GET和POST方法提交.hi-nginx会把这些数据解析出来,放在form成员变量里.对pyth ...

  7. (27) java web的struts2框架的使用-基于表单的多文件上传

    和单个文件上传配置都是一样的,只是在action中接受参数时候,接受的是数组,不再是单个的文件. 一,action的实现: public class MutableFilesUpload extend ...

  8. (转)WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  9. WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  10. 学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载

    输入校验是 Web 开发任务之一,在 SpringMVC 中有两种方式可以实现,分别是使用 Spring 自带的验证 框架和使用 JSR 303 实现, 也称之为 spring-validator 和 ...

随机推荐

  1. 百万架构师第四十三课:Nginx:Nginx 应用实战|JavaGuide

    百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 课程目标: Nginx 反向代理功能配置 Nginx 负载均衡实战 Nginx 动静分离配置 ...

  2. 开源一款DDS信号发生扩展板-FreakStudio多米诺系列

    原文链接: FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波.方波和三角波,频率小于1MHz.支持幅度调节,提供原始和6倍放大输出接口.配备5阶低通滤波器.噪 ...

  3. 基于注意力机制与改进TF-IDF的推荐算法

    前言 本篇文章是2020年8月发表于<计算机工程>的一篇期刊论文,文章名称<基于注意力机制与改进TF-IDF的推荐算法>. 文章针对传统推荐系统主要依赖用户对物品的评分数据而无 ...

  4. 分布式锁—6.Redisson的同步器组件

    大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5 ...

  5. AI 智能体引爆开源社区「GitHub 热点速览」

    最近很火的 Manus 智能体是一款将你的想法转化为行动的工具,能够处理生活中的各种任务.一经发布便迅速走红,并间接引爆了开源社区. 这也导致上榜的全是 AI 智能体开源项目,比如无需邀请码的开源版 ...

  6. MySQL 中 DATETIME 和 TIMESTAMP 时间类型的区别及使用场景

    MySQL的日期类型简介 在 MySQL 中有两种存储时间的数据类型 DATETIME 和 TIMESTAMP,它们在数据库实际应用中,各有各的优势和劣势. 一. DATETIME 和 TIMESTA ...

  7. 0003 Failed to build the application: build go_beego/src/hello: cannot load

    我使用beego框架快速建立了一个应用,可当我运行 bee run的时候,出现了如下错误 D:\go_beego\src\product>bee run ______ | ___ \ | |_/ ...

  8. 基础指令:三剑客之sed、三剑客之awk详解

    目录 4.9 三剑客之sed(查找.替换.删除.插入) 作用: 语法格式: 4.9.1 sed指定行输出 [行数]p 4.9.2 sed模糊搜索 /[字符串]/p 4.9.3 按照区间进行过滤查找 [ ...

  9. MTR工具使用说明与结果分析

    免责声明: 本文档可能包含第三方产品信息,该信息仅供参考.阿里云对第三方产品的性能.可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺. 概述 当客户端访问目标服务器或负载均衡,使用pin ...

  10. JDK8-时间格式化类-时区类-工具类--java进阶day07

    1.时间格式化类:DateTimeFormatter 1.创建方式 使用DateTimeFormatter调用ofPattern方法即可 . 2.格式化方法 创建好DateTimeFormatter对 ...