使用django-backbone应用程序进行服务器端验证的最佳实践是什么?

时间:2012-06-23 15:08:27

标签: django django-models backbone.js django-forms

尝试在服务器端使用backbone和django进行单页面应用。

使用Django的ModelForm进行验证并不是很好,因为嵌套模型和在适当的位置向用户显示错误消息的困难。

在Django中验证模型属性是否有任何良好实践,并将其显示在单页应用程序的页面上?

1 个答案:

答案 0 :(得分:3)

我们使用修改后的backbone.js和django-rest-framework在生产中使用这个确切的设置生成单页应用。

我们通过DRF资源使用ModelForm验证(结帐DRF如果您想为单页应用设置API,它非常直接且可自定义)。当使用嵌套模型时,我们为每个视图绑定一个模型并单独处理保存,首先我们保存主模型,并且在保存成功时,我们保存嵌套模型,每个模型都有单独的错误处理。

在主干方面,我们有一个特殊的FormView来处理表单的呈现,错误处理等。它有一个“提交”方法,它将表单序列化并将数据保存到模型中,看起来有点像这个(我们删除了一些更多的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方面,如果你使用ModelResource和ModelForm验证,DRF可以很好地处理它。