fields_for_model returns all fields when fields parameter is the empty tuple
|Reported by:||alexdutton||Owned by:||nobody|
|Cc:||Triage Stage:||Ready for checkin|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
When attempting to use modelformset_factory to generate forms where the user can only delete objects (i.e. not edit them), one would expect a fields=() to create forms with only delete checkboxes. However, fields_for_model uses the following check to determine whether to restrict fields:
if fields and not f.name in fields: continue
When passed the empty tuple, fields are never skipped as bool( () ) == False, resulting in all fields being displayed.
This should be:
if fields is not None and not f.name in fields: continue
I've attached a patch for both construct_instance (which also has the wrong behaviour) and fields_for_model.
The additional regression tests cover construct_instance, fields_for_model, modelformset_factory and ModelForm. The latter is included even though the usage of fields=() in the this case is arguably nonsensical.
Change History (3)
Changed 5 years ago by alexdutton
comment:1 Changed 5 years ago by ramiro
- Needs documentation unset
- Needs tests unset
- Patch needs improvement unset
- Triage Stage changed from Unreviewed to Ready for checkin