Django实现图片文字同时提交的方法


Posted in Python onMay 26, 2015

本文实例讲述了Django实现图片文字同时提交的方法。分享给大家供大家参考。具体分析如下:

jQuery为我们网站开发解决了很多问题,使我们的网站用户体验大大的提高了。举个简单的例子,我们用AJAX技术来实现对表单的异步提交,使用户在体验上有了很大的改观,用户在提交数据的同时还可以干一些其他的事情。

不过,今天在开发中遇到一个特别头痛的问题,刚开始不知道,以为可以实现,纠结了将近4个小时之久,但结果很是令人失望。

问题是这样的:为了提高用户体验,我决定使用AJAX异步提交,于是我用jQuery的$.post去异步提交表单数据,文本信息可以很轻松的提交,但是,却怎么也无法提交图片数据。怎么办呢?

在网上查了很多资料,后来发现jQuery不支持图片上传(附件上传),但是有相关的插件,于是我开始慢慢琢磨,开始用另一个专门上传文件的插件jquery.ajaxfileupload.js,折腾了很久,总可以上传图片了。但是新的问题有产生了。

通过ajaxfileupload来异步上传图片的同时,却不能提交文本数据。?灏 ??

在网上查了很多资料,折腾了许久,没有Django开发的相关资料,怎么办?自己想办法…….

后来找到了解决方案,跟大家分享一下:

思路:

由于使用jquery.ajaxfileupload.js插件不能传递自定义的参数,肿么办?自己改写插件呗。碰巧,网上有别人改过的现成代码,二话不说,先拿来试试。以下即是我试验的过程。

1. 前台页面(部分代码):

<table border="0" width="100%"> 
  <form action="." method="post" id="annex_form_2"></form> 
  <tbody> 
  <tr> 
    <td class="col_name" nowrap="nowrap" width="26%">证书名称:</td>
    <td width="64%"><input size="65" class="input_general" id="prove_name_2" maxlength="50" name="prove_name" 
                type="text"></td> 
    <td nowrap="nowrap" width="7%"></td> 
    <td nowrap="nowrap" width="3%"><a href="javascript:void(0);" onclick="SubmitAnnexInfo(2)" title="保存"><img 
        src="/static/img/hr_manage/btn_save.gif" alt="点此保存"></a></td> 
  </tr> 
  <tr> 
    <td class="col_name">证件类型:</td> 
    <td><select id="prove_type_2" name="prove_type"> 
      <option selected="selected" value="1">身份证</option> 
      <option value="2">学位证</option> 
      <option value="3">其他证</option> 
    </select></td> 
    <td> </td> 
    <td> </td> 
  </tr> 
  <tr> 
    <td class="col_name">证书描述:</td> 
    <td><input size="80" class="input_general" id="prove_desc_2" maxlength="60" name="prove_desc" type="text"></td> 
    <td> </td> 
    <td> </td> 
  </tr> 
  <tr> 
    <td class="col_name">附件地址:</td> 
    <td><input size="45" class="input_general" id="prove_url_2" maxlength="45" name="prove_url" style="border:0px;" 
          type="file"></td> 
    <td> </td> 
    <td> </td> 
  </tr> 
  <tr> 
    <td colspan="4"> 
      <hr> 
    </td> 
  </tr> 
  </tbody> 
</table>

2. 更改后的jquery.ajaxfileupload.js:

jQuery.extend({ 
  createUploadIframe: function(id, uri) 
   { 
        //create frame 
      var frameId = 'jUploadFrame' + id; 
      if(window.ActiveXObject) { 
        var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />'); 
        if(typeof uri== 'boolean'){ 
          io.src = 'javascript:false'; 
        } 
        else if(typeof uri== 'string'){ 
          io.src = uri; 
        } 
      } 
      else { 
        var io = document.createElement('iframe'); 
        io.id = frameId; 
        io.name = frameId; 
      } 
      io.style.position = 'absolute'; 
      io.style.top = '-1000px'; 
      io.style.left = '-1000px'; 
      document.body.appendChild(io); 
      return io        
  }, 
  createUploadForm: function(id, fileElementId, data) 
   { 
     //create form   
     var formId = 'jUploadForm' + id; 
     var fileId = 'jUploadFile' + id; 
     var form = $('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');   
     var oldElement = $('#' + fileElementId); 
     var newElement = $(oldElement).clone(); 
     $(oldElement).attr('id', fileId); 
     $(oldElement).before(newElement); 
     $(oldElement).appendTo(form); 
     //增加文本参数的支持 
     if (data) { 
        for (var i in data) { 
          $('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form); 
        } 
     } 
     //set attributes 
     $(form).css('position', 'absolute'); 
     $(form).css('top', '-1200px'); 
     $(form).css('left', '-1200px'); 
     $(form).appendTo('body');      
     return form; 
  }, 
  ajaxFileUpload: function(s) { 
    // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout      
    s = jQuery.extend({}, jQuery.ajaxSettings, s); 
    var id = new Date().getTime()     
     var form = jQuery.createUploadForm(id, s.fileElementId, s.data); 
     var io = jQuery.createUploadIframe(id, s.secureuri); 
     var frameId = 'jUploadFrame' + id; 
     var formId = 'jUploadForm' + id;      
    // Watch for a new set of requests 
    if ( s.global && ! jQuery.active++ ) 
     { 
        jQuery.event.trigger( "ajaxStart" ); 
     }       
    var requestDone = false; 
    // Create the request object 
    var xml = {}  
    if ( s.global ) 
      jQuery.event.trigger("ajaxSend", [xml, s]); 
    // Wait for a response to come back 
    var uploadCallback = function(isTimeout) 
     {        
        var io = document.getElementById(frameId); 
      try 
        {           
          if(io.contentWindow) 
          { 
             xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null; 
           xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
          }else if(io.contentDocument) 
          { 
             xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null; 
           xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document; 
          }                
      }catch(e) 
        { 
          jQuery.handleError(s, xml, null, e); 
        } 
      if ( xml || isTimeout == "timeout") 
        {           
        requestDone = true; 
        var status; 
        try { 
          status = isTimeout != "timeout" ? "success" : "error"; 
          // Make sure that the request was successful or notmodified 
          if ( status != "error" ) 
             { 
            // process the data (runs the xml through httpData regardless of callback) 
            var data = jQuery.uploadHttpData( xml, s.dataType );   
            // If a local callback was specified, fire it and pass it the data 
            if ( s.success ) 
              s.success( data, status ); 
            // Fire the global callback 
            if( s.global ) 
              jQuery.event.trigger( "ajaxSuccess", [xml, s] ); 
          } else 
            jQuery.handleError(s, xml, status); 
        } catch(e) 
          { 
          status = "error"; 
          jQuery.handleError(s, xml, status, e); 
        } 
        // The request was completed 
        if( s.global ) 
          jQuery.event.trigger( "ajaxComplete", [xml, s] ); 
        // Handle the global AJAX counter 
        if ( s.global && ! --jQuery.active ) 
          jQuery.event.trigger( "ajaxStop" ); 
        // Process result 
        if ( s.complete ) 
          s.complete(xml, status); 
        jQuery(io).unbind() 
        setTimeout(function() 
          {   try 
            { 
              $(io).remove(); 
              $(form).remove();   
            } catch(e) 
            { 
              jQuery.handleError(s, xml, null, e); 
            }                       
          }, 100) 
        xml = null 
      } 
    } 
    // Timeout checker 
    if ( s.timeout > 0 ) 
     { 
      setTimeout(function(){ 
        // Check to see if the request is still happening 
        if( !requestDone ) uploadCallback( "timeout" ); 
      }, s.timeout); 
    } 
    try 
     { 
      // var io = $('#' + frameId); 
        var form = $('#' + formId); 
        $(form).attr('action', s.url); 
        $(form).attr('method', 'POST'); 
        $(form).attr('target', frameId); 
      if(form.encoding) 
        { 
        form.encoding = 'multipart/form-data';
      } 
      else 
        {           
        form.enctype = 'multipart/form-data'; 
      }        
      $(form).submit(); 
    } catch(e) 
     {        
      jQuery.handleError(s, xml, null, e); 
    } 
    if(window.attachEvent){ 
      document.getElementById(frameId).attachEvent('onload', uploadCallback); 
    } 
    else{ 
      document.getElementById(frameId).addEventListener('load', uploadCallback, false); 
    }      
    return {abort: function () {}};   
  }, 
  uploadHttpData: function( r, type ) { 
    var data = !type; 
    data = type == "xml" || data ? r.responseXML : r.responseText; 
    // If the type is "script", eval it in global context 
    if ( type == "script" ) 
      jQuery.globalEval( data ); 
    // Get the JavaScript object, if JSON is used. 
    if ( type == "json" ) 
      eval( "data = " + data ); 
    // evaluate scripts within html 
    if ( type == "html" ) 
      jQuery("<div>").html(data).evalScripts(); 
        //alert($('param', data).each(function(){alert($(this).attr('value'));})); 
    return data; 
  } 
})

3. 调用方法

//保存附件信息 
function SaveAnnexInfo() { 
  var prove_name = $("#id_prove_name").val(); //从界面得到值 
  var prove_type = $("#id_prove_type").val(); 
  var prove_desc = $("#id_prove_desc").val(); 
  $.ajaxFileUpload({  
    url: "/test/annex_info /",   //请求的Url地址 
    secureuri:false,  
    fileElementId:'id_prove_url',  
    dataType: 'json',  
    data: {   //加入的文本参数  
      "prove_name":prove_name, 
      "prove_type":prove_type,  
      "prove_desc":prove_desc 
    },  
    success: function(data) {  
      asyncbox.tips('操作成功!', 'success');          
    },  
    error: function() {  
      asyncbox.tips("上传失败,请检查文件是否符合格式要求。");  
     }  
  });  
}

4. Python后台处理(代码片段)

if annex_form.is_valid(): 
     annex_info = annex_form.save(commit=False) 
     #获取上传 
     annex_url = request.FILES.get('prove_url','') #取附件 
     annex_info.entry = entry_info 
     annex_info.prove_url = annex_url 
     annex_info.save() 
     return HttpResponse(1) #操作成功 
return HttpResponse(0) #操作失败

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
python 调用win32pai 操作cmd的方法
May 28 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
python3爬虫怎样构建请求header
Dec 23 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
python 实现Requests发送带cookies的请求
Feb 08 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
Python实现的简单算术游戏实例
May 26 #Python
Django中使用group_by的方法
May 26 #Python
python3序列化与反序列化用法实例
May 26 #Python
python实现用于测试网站访问速率的方法
May 26 #Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 #Python
Python易忽视知识点小结
May 25 #Python
Python中类型关系和继承关系实例详解
May 25 #Python
You might like
PHP 采集程序原理分析篇
2010/03/05 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
用jscript实现新建word文档
2007/06/15 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
JavaScript打印网页指定区域的例子
2014/05/03 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python实现堆栈与队列的方法
2015/01/15 Python
Python实现LRU算法的2种方法
2015/06/24 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
flask-restful使用总结
2018/12/04 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
python实现计算器功能
2019/10/31 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
干部选拔任用方案
2014/05/26 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
Python基本数据类型之字符串str
2021/07/21 Python