2016-07-01 1 views
0

Я делаю приложение todo с django restapi и позвоночником. c, r, d, но когда я пытаюсь обновить, запрос PUT идет без косой черты http: //127.0.0.1:8000/api/lists/41 вместо http: //127.0.0.1:8000/api/lists/41/. и я получаю 500 internal server error.Как добавить косую черту в PUT rest api request url в файле js

хром сообщение:

RuntimeError в/API/списки/41

Вы назвали этот URL через PUT, но URL не заканчивается косой черты и у вас есть APPEND_SLASH набор. Django не может перенаправлять на косу черты, сохраняя данные PUT. Измените свою форму , чтобы указать на 127.0.0.1:8000/api/lists/41/ (обратите внимание на конечную косую черту) или установите APPEND_SLASH = False в настройках Django.

Запрос Метод: PUT запрос URL: http://127.0.0.1:8000/api/lists/41

Согласно сообщению, если я добавлю APPEND_SLASH = False, все ответы restapi терпят неудачу.

Мои scripts.js файл:

/** 
* Created by Manoj on 6/29/2016. 
*/ 


var List = Backbone.Model.extend({ 
    defaults: 
    { 
     "work": "", 
     "done": false 
    } 
}); 

var ListsCollections = Backbone.Collection.extend({ 
     model: List, 
     url : "http://127.0.0.1:8000/api/lists/" 
}); 


var ListView = Backbone.View.extend 
({ 
    tagName : "tr", 
    listtemplate: _.template($('#list2-template').html()), 

    render: function() { 
     this.$el.html(this.listtemplate(this.model.attributes)); 
     //this.$el.html("afsfa"); 
     return this; 
    } 
}); 

var ListsView = Backbone.View.extend({ 
    el: "#table-body", 
    model : ListsCollections, 

    // events:{ 
    //  'click #add': 'addList' 
    // }, 

    initialize : function(){ 
     $("#table-body").html(''); 
     this.render(); 
    }, 

    render:function(){ 
     var c = new ListsCollections,i=1; 
     self = this; 
     c.fetch({ 
      success : function(){ 
      self.$el.html(''); 
       c.each(function(model){ 
        var stud_ = new ListView({ 
         model : model, 
        }); 

        self.$el.append(stud_.render().el); 
       }); 
      } 
     }); 

     //Rendering on to the screen 
     return this; 
    }, 

    addList: function (e) { 
     e.preventDefault(); 
     var temp = new Backbone.Collection; 
     $("#details").html('<input type="text" id="work_input"/><input type="checkbox" id="done_input"/><input id="clicker" type="submit"/>'); 
     $("#clicker").click(function(){ 

      var temp1 = new ListsCollections; 
      temp1.create({ 
       userid: 1, 
       work : $("#work_input").val(), 
       done : $("#done_input").val() 
      }); 
      $("#details").html(''); 
      var k = new ListsView; 
      k.render(); 
      parent.location.hash=''; 
     }); 
    } 
}); 


//Creating route paths 
var myRouter = Backbone.Router.extend({ 

    routes : { 
     "lists/add" : "addList", 
     "lists/delete/:id" : "deleteList", 
     "lists/update/:id" : "updateList" 
    }, 

    addList : function() 
    { 
     $("#details").html('<input type="text" id="work_input"/><input type="checkbox" value = "TRUE" id="done_input"/><input id="clicker" type="submit"/>'); 
     var user = user; 
     $("#clicker").click(function(){ 

      var temp1 = new ListsCollections; 
      temp1.create({ 
       userid: 1, 
       work : $("#work_input").val(), 
       done : document.getElementById('done_input').checked 
      }); 
      $("#details").html(''); 
      var k = new ListsView; 
      k.render(); 
      parent.location.hash=''; 
     }); 

    }, 

    deleteList : function(e){ 
     var temp = new ListsCollections; 
     temp.fetch({ 
      success : function(){ 
       temp.findWhere({id : parseInt(e)}).destroy({ 
        'success': function() { 
         var k = new ListsView; 
         k.render(); 
         parent.location.hash=''; 
        } 
       }); 
      } 
     }) 
    }, 

    updateList : function(eid){ 
     $("#details").html('<input type="text" id="work_input" value=""/><input type="checkbox" id="done_input"/><input id="clicker" type="submit"/>'); 
      $("#clicker").click(function(){ 
       var temp1 = new ListsCollections; 
       temp1.fetch({ 
        'success' : function() 
        { 
         var tag = temp1.get(parseInt(eid)); 
         tag.set({"work" : $("#work_input").val()}); 
         tag.set({"done" : document.getElementById('done_input').checked}); 
         tag.save(null, 
          { 
           "success" : function() { 
           $("#details").html(''); 
           var k = new ListsView; 
           k.render(); 
           parent.location.hash=''; 
          }} 
         ); 

        } 
       }) 
      }); 
    }, 

    updateList2: function (e) { 
     $("#details").html('<input type="text" id="work_input" value=""/><input type="checkbox" id="done_input"/><input id="clicker" type="submit"/>'); 
     $("#clicker").click(function() { 

     }) 
    }, 
}); 

var router = new myRouter(); 
Backbone.history.start(); 
var app = new ListsView; 

ответ

1

Вот прямо вперед решение. Просто создайте базовый класс Backbone Model, который добавляет конечную косую черту при запросе конкретного объекта и выводит из нее все ваши собственные модели. Как это:

var DjangoModel = Backbone.Model.extend({ 
    // if backbone wants a specific object, append the slash 
    url : function() { 
     if (this.get('id')) { 
      return this.collection.url + this.get('id') + '/'; 
     } 
     else { 
      return this.collection.url; 
     } 
    } 
}); 

Я использую это решение с Джанго Rest Framework в конфигурации по умолчанию, и больше назад и с tastypie. Работает как шарм.

+0

@ManojCh, если это сработало для вас, и вы довольны ответом, пожалуйста, нажмите на большую галочку рядом с моим ответом, чтобы указать это. –

0

Удалить слэш из ListsCollections

var ListsCollections = Backbone.Collection.extend({ 
    model: List, 
    url : "http://127.0.0.1:8000/api/lists" 
}); 
Смежные вопросы