user784756
user784756

Reputation: 2363

Backbone.js not saving to database

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()));
       }
    });     
    //});

Upvotes: 0

Views: 462

Answers (1)

Paul
Paul

Reputation: 18597

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.

Upvotes: 1

Related Questions