2015-01-01

Published on 2015-01-01


Django Form Field中NullBooleanField的处理

首先说一下背景吧,新建一个Model,其中包含一个NullBooleanField类型的字段,同时新建对应的Form,也包含一个NullBooleanField类型的字段,那么问题来了,给Form传入javascript的null/true/false值,最终数据库中永远都是NULL

关于这个问题,Django的官方文档中的描述也有错误,如对Form的NullBooleanField类型,文档中说

Default widget: NullBooleanSelect

而NullBooleanSelect的描述就离谱了

Select widget with options ‘Unknown’, ‘Yes’ and ‘No’

真的是这样么?如果你使用字符串'Unknown', 'Yes', 'No'中的任意一个,最终插入数据库的依然是NULL。经过我仔细排查,发现NullBooleanSelect生成的HTML内容如

<select id="id_xxx" name="xxx">
  <option value="1">Unknown</option>
  <option value="2">Yes</option>
  <option value="3">No</option>
</select>

是不是恍然大悟了!对,虽然HTML中option标签内容是'Unknown', 'Yes', 'No'中的,但是他们的值却是1~3!!!再次测试,将值2传给Form中的NullBooleanField类型的字段,果然数据库中保存了1,同样传给其3则数据库中正确保存0。经过测试,传给任何其他的值都会在数据库中得到NULL值。