Question

I am running Django + Backbone.js and .save() has no effect. What am I doing wrong? This is my backbone javascript code. I am trying to implement a prioritized to do list and I cannot figure out how to POST back to the server. Chromium isn't even seeing an attempted post when I try: T = new Task(); T.save();

In the console.

    //$(function() {

      /**
       * Model: Task
       * name, date, importance
       */
      window.Task = Backbone.Model.extend({
        urlRoot: '/api/v1/task/',

        initialize: function() {
          console.log("New task: " + JSON.stringify(this.toJSON()));
        }

        , defaults: function() {
          return {
        date: new Date()
        , name: "New event"
        , importance: 0
          };
        }


      });

      /**
       * Collections: Calendar
       */

      window.Calendar = Backbone.Collection.extend({
          //urlRoot: '/api/v1/calendar',

        initialize: function() {
          console.log("New calendar: " + JSON.stringify(this.toJSON()));
        }

        , model: Task

        , comparator: function(task) {
          return task.get("date");
        }

    /*
        , before: function(thresholdDate) {
          return this.filter( function(task) {
        task.get('date') < thresholdDate;
          });
        }
    */


      });

      window.TaskView = Backbone.View.extend({

        tagName: "li"



      });
     now = new Date();

    Day = Backbone.Collection.extend({
        model: Task,
        url: '/api/v1/task/?format=json&calendar__id=1&date='+ now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate(),
        parse: function(response) {
        return response.objects;
        },

        comparator: function(task){
        return task.get('priority');}

     });

    Month = Backbone.Collection.extend({
        model: Task,
        url: 'api/v1/task/?format=json&date__month='+(now.getMonth()+1),
        parse: function(response){
        return response.objects;
        },
        comparator: function(task){
        return task.get('priority');}

        });


    Year = Backbone.Collection.extend({
        model: Task,
        url: 'api/v1/task/?format=json&date__year='+now.getFullYear(),
        parse: function(response){
        return response.objects;
        },
        comparator: function(task){
        return task.get('priority');}
        });




    // required for saving
          Backbone.sync = function(method, model) {
      console.log(method + ": " + JSON.stringify(model));
      model.id = 1;
    };




    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
        if (o[this.name] !== undefined) {
            if (!o[this.name].push) {
            o[this.name] = [o[this.name]];
            }
            o[this.name].push(this.value || '');
        } else {
            o[this.name] = this.value || '';
        }
        });
        return o;
    };

    $(function() {
        $('form').submit(function() {
        var dict = $('form').serializeObject();
        var new_task = new Backbone.Model({
        date: toString(dict.date),
        name: toString(dict.name),
        priority: toString(dict.priority)});
        console.log("new_task =" + new_task);
         new_task.save();
        console.log(dict);

        return false;
        });

    });

    TaskView = Backbone.View.extend({
        el: $("div#app"),
        render: function() {
        $(thi.el).html(this.template(this.model.toJSON()));
       }
    });     
    //});

No correct solution

OTHER TIPS

You have overridden the Backbone.sync method to only log a console message.

If you override Backbone.sync then you need to manually perform the save logic within that method.

So either delete the code where you override Backbone.sync or add the ajax call within that code to perform the save.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top