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

使用django主干应用程序进行服务器端验证的最佳实践是什么?,django,django-models,backbone.js,django-forms,Django,Django Models,Backbone.js,Django Forms,尝试在服务器端使用主干网和django创建单页应用程序 使用Django的ModelForm进行验证在这方面看起来并不理想,因为嵌套的模型和在适当的位置向用户显示错误消息的困难 在Django中验证模型属性并将其显示在单页应用程序的页面上有什么好的做法吗?我们有一个单页应用程序正在生产中,使用经过修改的backbone.js和Django rest框架进行设置 我们通过DRF资源使用ModelForm验证(如果您想为一个单页应用程序设置API,那么它是非常直接和可定制的)。使用嵌套模型时,我们为

尝试在服务器端使用主干网和django创建单页应用程序

使用Django的ModelForm进行验证在这方面看起来并不理想,因为嵌套的模型和在适当的位置向用户显示错误消息的困难


在Django中验证模型属性并将其显示在单页应用程序的页面上有什么好的做法吗?

我们有一个单页应用程序正在生产中,使用经过修改的backbone.js和Django rest框架进行设置

我们通过DRF资源使用ModelForm验证(如果您想为一个单页应用程序设置API,那么它是非常直接和可定制的)。使用嵌套模型时,我们为每个视图绑定一个模型并分别处理保存,首先保存主模型,保存成功后,保存嵌套模型,每个模型都有单独的错误处理

在主干端,我们有一个特殊的FormView,用于处理表单的呈现、错误处理等。它有一个“submit”方法,用于序列化表单并将数据保存到模型中,看起来有点像这样(我们有一个更健全的检查逻辑,我去掉了,这不是我们的确切代码,更像javascript的伪代码,甚至可能运行:))

FormView=Backbone.View.extend({
//…遗漏了渲染、序列化等功能
提交:函数(){
var data=form.serialize();
var self=这个;
self.clearErrors();
self.model.save(数据、{
成功:功能(模型、响应){
self.showsucture(response)//显示保存成功消息
},
错误:函数(模型、响应){
self.batherRor($.parseJSON(response.responseText))//显示错误
}
})
},
clearErrors:function(){
var self=这个;
self.$(“ul.non-field errors”).empty()//清除主窗体错误列表
_.each(self.fields、function(field){
self.$(“ul.field errors#field-“+field.name+”])。empty();
});
},
错误:功能(错误){
/*
DRF以dict的形式给出错误:
{
错误:[error1,error2,…],//表单级错误
字段错误:{//字段级错误
字段名称1:[error1,error2,…],
字段名称2:[error1,error2,…],
}
}
*/
var self=这个;
self.$(“ul.form errors”).empty()//清除主窗体错误列表
_.each(错误。非字段错误,函数(错误){
self.$(“ul.errors”)。追加(“
  • ”+error+”
  • ”); }); _.each(errors.field-errors,函数(error,field\u name){ _.each(错误,函数(错误){ self.$(“ul.field errors#field-“+field_name+”])。追加(“
  • ”+error+”
  • ”); }); }); } });
    在django方面,如果您使用ModelResource和ModelForm验证,DRF可以为您很好地处理它

    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>");
            });
        });
    }
    
    });