-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Description
NetBox version
v2.10.8
Python version
3.8
Steps to Reproduce
- Add a new 'Device Type'
- Enter required field data and UN-CHECK 'is full depth' (is_full_depth == False)
- Click 'Create and Add Another'.
- Page re-loads with some fields pre-populated. 'Is full depth' is CHECKED (is_full_depth == True)
or
- Create a new Device Type with Is full depth == False.
- Clone the new Device Type.
Expected Behavior
The 'Is full depth' field is UN-CHECKED when the page re-loads to add another Device Type.
The False state of a Boolean field is maintained when cloning.
Observed Behavior
The state of Boolean fields that are set to False are not carried over when creating an object and then using the 'Create and Add Another' option.
For example, the DeviceType model defines:
clone_fields = [
'manufacturer', 'u_height', 'is_full_depth', 'subdevice_role',
]
So the Is full depth field value should be carried over when cloning an existing object or when the form re-loads after clicking 'Create and Add Another'. In both cases, the 'is_full_depth' field is omitted from the query string. For example, my test resulted in:
dcim/device-types/add/?manufacturer=1&u_height=1&subdevice_role=parent
The issue is partly in utilities.utils.prepare_cloned_fields(). This function has code that sets any field with a value of False to the empty string (''). The function then only adds fields that aren't set to a value of None or the empty string to the query params.
227 # Swap out False with URL-friendly value
228 if field_value is False:
229 field_value = ''
230
231 # Omit empty values
232 if field_value not in (None, ''):
233 params.append((field_name, field_value)
I've tested commenting out lines 228 and 229. This adds the False boolean field back in to the query params, but still leaves the check-box on the form selected. I'm not sure of a solution to this, whilst still retaining the check-box widget, but I've overcome it by using something like this for the form field:
is_full_depth = forms.ChoiceField(
choices=((True, "Yes"), (False, "No"),),
widget=forms.Select(),
required=True,
)