2012-06-23 59 views
2

嘗試在服務器端使用backbone和django製作單頁面應用程序。django-backbone應用服務器端驗證的最佳實踐是什麼?

使用Django的ModelForm進行驗證對於此目的看起來並不太好,因爲嵌套模型和向適當位置的用戶顯示錯誤消息的困難。

是否有任何良好的做法來驗證Django中的模型的屬性,並將其顯示在單頁面應用程序的頁面上?

回答

2

我們使用經過修改的backbone.js和django-rest-framework,使用此確切設置生產單頁應用程序。

我們通過DRF資源使用ModelForm驗證(如果您想爲單個頁面應用程序設置API,那麼它非常直接並且可定製),請檢查DRF。在使用嵌套模型時,我們爲每個視圖綁定一個模型並分別處理保存,首先保存主模型,並在保存成功後保存嵌套模型,每個模型都有單獨的錯誤處理。

在骨幹端,我們有一個特殊的FormView,用於處理表單的渲染,錯誤處理等。它有一個'ubmit'-方法來序列化表單並將數據保存到模型中,看起來有點像這樣的(我們有,我剝出多一點sanitychecking邏輯,這不是我們確切的代碼,甚至可能會遇到更多的:)非常的JavaScript類僞代碼)

FormView = Backbone.View.extend({ 

// ... left out functionality for rendering, serializing, etc 

submit: function(){ 
    var data = form.serialize(); 
    var self = this; 

    self.clearErrors(); 
    self.model.save(data,{ 
     success: function(model, response){ 
      self.showSuccess(response) // displays a save-success message 
     }, 
     error: function(model, response){ 
      self.showError($.parseJSON(response.responseText)) //displays errors 
     } 
    }) 
}, 

clearErrors: function(){ 
    var self = this; 
    self.$("ul.non-field-errors").empty() // Clear the main form error list 
    _.each(self.fields, function(field){ 
     self.$("ul.field-errors#field-" + field.name + "]").empty(); 
    }); 
}, 

showErrors: function(errors){ 
    /* 
    Errors are given by DRF as a dict: 
    { 
     errors: [error1, error2, ...], // form level errors 
     field-errors: { // field level errors 
      field_name1 : [error1, error2, ...], 
      field_name2 : [error1, error2, ...], 
     } 
    } 
    */ 
    var self = this; 
    self.$("ul.form-errors").empty() // Clear the main form error list 
    _.each(errors.non-field-errors, function(error){ 
     self.$("ul.errors").append("<li>"+error+"</li>"); 
    }); 
    _.each(errors.field-errors, function(error, field_name){ 
     _.each(error, function(err){ 
      self.$("ul.field-errors#field-" + field_name + "]").append("<li>"+error+"</li>"); 
     }); 
    }); 
} 

}); 

在Django的一面,DRF可以處理如果您使用ModelResource和ModelForm驗證,那麼它非常適合您。

相關問題