django动态表格总结

应用场景: A与B之间存在一对多关系.

 

CBV实现方案:

      CreateView/UpdateView + inlineformset + jquery

具体:

      view方面:重写post/get方法, 或者 get_context_data/form_valid方法。

      template方面:注意利用can_delete属性,{{form.DELETE}},将已存在的记录打上true标记,则在保存时自动删除相应记录。

      jquery:注意元素的准确定位。这里罗嗦下:判断一行是否是已经存在的行还是新增加的(尚未保存到db)的行的方法是判断{{form.id}}生成的隐藏域的value是否为""或者undefined,如果是,则为新增的行,可以用jq将此行remove掉,同时不要忘了更新所有的控件的id以及行数保存的隐藏域的值。

      $.each(function(index, each_obj){}).  (index在重新排定id时比较有用)

      $.parent() (取得直接父元素)

      $.parents() (取得所有父元素)

      $.children() (取得所有子元素)

      $.children().children() (此用法暂时还没明了过来)

      通配符: $("[attr *= bbb]") ,$("[attr ^= bbb]") ,$("[attr $= bbb]") 分别是contains,start_with,end_with逻辑。

 

     inlineformset的html操作的核心在于:

     1) 行数(在隐藏域)

     2) DELETE标志/id,在修改的时候是必需的

     3) 至少要extra=1,多出一行的处理(hide/show),且此行作为模板行,隐藏起来。

     4) 多种记录存在一个formset里面的处理(新增的记录,修改的记录,删除的记录),其中修改的记录和新增的处理比较简单--基本不用特别处理; 删除的情况有点复杂,删除原有的记录,还是删除新增加的记录,这个要人工判断,根据id隐藏域是否有value值,再相应的给delete标志位打标志。

 

 

 简单示例可以查看这里:https://github.com/TommyU/dynamic_form

posted @ 2014-08-27 22:39  tommy.yu  阅读(975)  评论(0编辑  收藏  举报