2013-03-07 71 views
2

我試圖上傳一個圖像文件backbone.js和JQuery到由Django REST框架製作的API。我已經開始遵循本教程http://10kblogger.wordpress.com/2012/05/25/a-restful-password-locker-with-django-and-backbone-js/Django的REST框架和Backbone.js文件上傳問題

當我去提交表單並上傳文件時,我收到了一個錯誤的請求,說明照片是必需的,儘管我選擇了一個文件。

我得到的錯誤是:

{ 「照片」: 「Thisfieldisrequired」]}

也:

的請求的URL /靜態/媒體/ C:/ fakepath/music notes.png在此服務器上找不到。

我的HTML:

<div id="listingModal" class="modal hide fade"> 
    <form id="listingForm" enctype="multipart/form-data" method="post"> 
     <div class="modal-header"><button class="close" data-dismiss="modal">×</button> 
      <h3>Listing Details</h3> 
     </div> 
     <div class="modal-body">{{ form }}</div> 
     <div class="modal-footer"> 
      <a class="btn" href="#" data-dismiss="modal">Cancel</a> 
      <input class="btn btn-primary" type="submit" value="Save" /> 
     </div> 
    </form> 
</div> 

的節電功能:

handleModal: function(event) 
    { 
     event.preventDefault(); 
     event.stopImmediatePropagation(); 
     var form = $('#listingForm'); 

     var listingData = 
     { 
      title: $(form).find('#id_title').val(), 
      description: $(form).find('#id_description').val(), 
      //user: $(form).find('#id_user').val(), 
      photo: $(form).find('#id_photo').val(), 
      trade_completed: $(form).find('#id_trade_completed').val(), 
      date_created: $(form).find('#id_date_created').val(), 
      date_completed: $(form).find('#id_date_completed').val(), 
     }; 

     if($('#listingModal').data('client_id')) 
     { 
      listingData.listing_id = $('#listingModal').data('client_id'); 
      this.listings.updateListing(listingData); 
     } 
     else 
     { 
      this.listings.addNew(listingData); 
     } 
      //hide the modal 
     $('#listingModal').modal('hide'); 

     return this; 

    }, 

的updateListing功能:

updateListing: function(listingData) 
    { 
     var listing = this.listings.get({id: listingData.listing_id}); 
     if(_.isObject(listing)) 
     { 
      //iterate through the data, and add it to the model 
      for(var key in listingData) 
      { 
       //dont copy id, already checked 
       if(key != 'listing_id') 
       { 
        listing.set(key,listingData[key]); 
       } 
      } 
      listing.save(); 
      //this.listings.sort(); 
     } 
    }, 

我讀過一些事情說這可能是因爲我必須努力盟友上傳文件,但不知道如何做到這一點。任何幫助將不勝感激。

編輯:這裏是我的settings.py媒體URL和靜態URL證明這一切都樹立正確的

MEDIA_ROOT = '/opt/bitnami/apps/django/django_projects/Project/Project/static/media/' 
MEDIA_URL = '/static/media/' 
STATIC_ROOT = '/opt/bitnami/apps/django/django_projects/Project/Project/static' 
STATIC_URL = '/static/static_files_dir' 

而且,特別是場被稱爲照片,是和模型的ImageField英寸

回答

2

不知道您是否因爲過去幾個月才找到解決方案,但我想我會迴應以防其他人在這個問題上絆倒。

將文件上傳到REST API資源URI需要特別小心,因爲它比僅使用一些標準(非文件)表單字段執行HTTP POST更復雜。但是,HTML5比以前更容易。

如果你看一下你的說法...

photo: $(form).find('#id_photo').val(), 

那請問獲得實際的文件。它抓取一個瀏覽器的字段字段實現放在那裏的臨時字符串。在你的情況下,它是C:/ fakepath/music notes.png

您需要獲取對控件上實際文件鍵的引用。對於使用jQuery使用一些示例代碼,閱讀How can I upload files asynchronously?

如果你想手卷自己上傳的功能,然後讀取http://www.html5rocks.com/en/tutorials/file/xhr2/#toc-send-formdata