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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Go语言图片处理和生成缩略图的方法

    本文实例讲述了Go语言图片处理和生成缩略图的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "os"     "image"     "image/color"     "image/draw"     "image/jpeg" ) func main() {     f1, err := os

  • golang基于websocket实现的简易聊天室程序

    本文实例讲述了golang基于websocket实现的简易聊天室.分享给大家供大家参考,具体如下: 先说点无关的,最近忙于工作没有更新博客,今天休息顺便把golang websocket研究了一下,挺好玩的,写了一个聊天室,分享给大家. websocket包 : code.google.com/p/go.net/websocket 文档 : http://go.pkgdoc.org/code.google.com/p/go.net/websocket 首先安装websocket包 复制代码 代码

  • go语言实现将重要数据写入图片中

    原理:将数据的二进制形式写入图像红色通道数据二进制的低位 只支持png格式的输出 写入数据 go run shadow.go -in="c.jpg" -data="hide me" -out="out.png" 读取数据 go run shadow.go -in="out.png" 复制代码 代码如下: package main import (     "errors"     "flag&qu

  • go语言读取json并下载高清妹子图片

    学了一天golang,一边看文档一边写的go读取分析json并下载图片 json api为爱壁纸HD mac 1920x1200版本,高清妹子图 总结:go+json=shit package main import ( "fmt" "io" "io/ioutil" "net/http" "os" "path/filepath" "strconv" //"e

  • go语言实现抓取高清图片

    看到有很多python 的,然后写了个go 的,可以抓取高清图片 getp.go 复制代码 代码如下: package main import (     "io/ioutil"     "log"     "net/http"     "os"     "regexp"     "strconv"     "strings"     "sync"

  • Django中实现点击图片链接强制直接下载的方法

    本文实例讲述了Django中实现点击图片链接强制直接下载的方法.分享给大家供大家参考.具体分析如下: 当用户点击图片连接时,默认为在浏览器中直接开打图片,这段代码可以让图片链接变成下载 这段代码也非常适合下载大文件,基本不会消耗内存,每次只读取一部分数据到内存,然后提供下载 def Download(request): def readFile(fn, buf_size=262144): f = open(fn, "rb") while True: c = f.read(buf_siz

  • GO语言实现批量压缩图片和水印

    前段时间想做个图片站,就用手机照了很多相片,但是要一个个用PS去压缩修改尺寸太麻烦了.最后想到了用golang去实现,算是边学边练吧.其中用到了github.com/nfnt/resize这个第三方库,仅仅支持JPG图片格式. 复制代码 代码如下: package main import (     "fmt"     "github.com/nfnt/resize"     "image"     "image/draw"

  • golang使用sort接口实现排序示例

    本文实例讲述了golang使用sort接口实现排序的方法.分享给大家供大家参考,具体如下: 今天看见群里再讨论排序的sort.Interface的实现,有童鞋一直搞不定,我就上手了一下,哦耶搞定了,代码放在这里. 其实很简单sort.Interface借口有三个方法,给自己的struct实现这三个方法,然后用将自己的结构体传给sort.Sort方法就排序完成. 当然sort包也有几个常用的方法sort.Float64Slice sort.IntSlise sort.StringSlise,呵呵

  • golang实现通过smtp发送电子邮件的方法

    本文实例讲述了golang实现通过smtp发送电子邮件的方法.分享给大家供大家参考,具体如下: 今天写了一个公司的邮件发送后台服务,php只需要把邮件存入数据库,然后golang写的mailservice就会吧邮件发送出去.这个公司的代码就不发出来的,以为带有公司的业务逻辑,我把代码整理了一下发布出来供大家参考.呵呵 复制代码 代码如下: package main import (     "fmt"     "net/mail"     "net/smt

  • Django Admin实现上传图片校验功能

    Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然其他 Web 框架也声称能提供同样的内容,但 Django 的独特之处在于它内置了管理应用程序 -- admin. admin 提供了开箱即用的高级 Create-Read-Update-Delete (CRUD) 功能,减少了重复工作所需的时间.这是许多 Web 应用程序的关键所在,程序员可以在开发时快速浏览他们的数据库模型:非技术最终用户可以在部署时使用 admin 添

  • golang实现http服务器处理静态文件示例

    本文实例讲述了golang实现http服务器处理静态文件的方法.分享给大家供大家参考,具体如下: 新版本更精简: 复制代码 代码如下: package main import (     "flag"     "log"     "net/http"     "os"     "io"     "path"     "strconv" ) var dir string

  • golang守护进程用法示例

    本文实例讲述了golang守护进程用法.分享给大家供大家参考,具体如下: 用node写了一个socket后台服务,可是有时候会挂,node一个异常就game over了,所以写了一个守候. 复制代码 代码如下: package main import (         "log"         "os"         "os/exec"         "time" ) func main() {         lf,

  • golang image图片处理示例

    本文实例讲述了golang image图片处理方法.分享给大家供大家参考,具体如下: golang处理图片挺简单的,我是过功能挺简单的,没有过一个缩略图方法. 复制代码 代码如下: package main import (     "fmt"     "os"     "image"     "image/color"     "image/draw"     "image/jpeg"

随机推荐