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. autMan奥特曼机器人-代理池配置教程

    一.优势: 全可视化 稳如老牛(从2.8.6开始) 隧道代理和接口获取,使用灵活 代理池运行状态指令可查:代理池 二.启用代理池并设置服务端口 代理池的启用与关闭,均为重启autMan生效 设置隧道代 ...

  2. 奥特曼框架autMan对接微信公众号的详细教程

    1.简介 微信公众号分为订阅号(个人)和服务号(公司),个人是可以申请的哈.具体怎么申请参见官方文档:https://kf.qq.com/faq/120911VrYVrA151009eIrYvy.ht ...

  3. Typecho弹出find Input author error怎么解决

    大多数报错的起因就是因为,有些模板归档页面的评论功能被阉割掉了 于是导致一些评论验证功能的插件爆这个错误. #解决方法有以下三种 1,编辑这些没有评论功能的页面,高级设置,关闭评论,然后发布文章. 2 ...

  4. sap 管理--企业解决方案 -设备管理

    1.什么是sap 管理 2.设备管理管的是什么 3.设备的几种状态 4.设备bom(物料清单) 5.测量点计数器 1.什么是sap 管理 System Applications and Product ...

  5. selenium 进入页面提示 503 Service Temporarily Unavailable

    进入三级页面提示503 Service Temporarily Unavailable,如果手动刷新页面重新加载成功 网上看都是如何配置及原因的,没告诉如何解决 于是我想,如果是这样的话,执行刷新操作 ...

  6. 遍历列表、元组或字符串的函数enumerate

    这两天在处理遇到的问题,循环遍历列表中的字典并输出到excel中 查阅资料发现了一个正和我意的函数 所以周一一上班我就开始试一试 然而发现 enumerate函数只适用于列表.元组或字符串的函数 语法 ...

  7. SICK Ranger3源码分析——断线重连

    前言 本文可在https://paw5zx.github.io/SICK-Ranger3-source-code-analysis-01/中阅读,体验更加 简单分析一下SICK Ranger3源码中断 ...

  8. 工作必会的Nginx的启动安装和常用配置例子

    概述 由于自己的之前学习 nginx 只会简单使用,然后每次配置 nginx 都要找文档去了解怎么配置,有点麻烦,所以这里记录下一些常用的nginx 配置和配置的例子,到时候直接 copy 修改即可. ...

  9. git push解决 error src refspec master does not match anyerror

    前言 git push origin master git push 时报错: error: src refspec master does not match anyerror: failed to ...

  10. vSphere虚拟化之ESXi的安装及部署

    vSphere虚拟化之ESXi的安装及部署一.什么是vSphere?vSphere是VNware公司在2001年基于云计算推出的一套企业级虚拟化解决方案.核心组件为ESXi.如今,经历了5个版本的改进 ...