应用场景: 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