In order to make this work well I think we would need to change z3c.form to store the field value on the widget before it's converted to a widget value. Then we could just check if the field value is None.

Or another option would be to give each widget an attribute that indicates what widget value means empty for that widget.