diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index ba0d02584..83be76169 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -346,20 +346,54 @@ class IPAddressBulkAddForm(BootstrapMixin, forms.Form): class IPAddressAssignForm(BootstrapMixin, forms.Form): - site = forms.ModelChoiceField(queryset=Site.objects.all(), label='Site', required=False, - widget=forms.Select(attrs={'filter-for': 'rack'})) - rack = forms.ModelChoiceField(queryset=Rack.objects.all(), label='Rack', required=False, - widget=APISelect(api_url='/api/dcim/racks/?site_id={{site}}', - display_field='display_name', attrs={'filter-for': 'device'})) - device = forms.ModelChoiceField(queryset=Device.objects.all(), label='Device', required=False, - widget=APISelect(api_url='/api/dcim/devices/?rack_id={{rack}}', - display_field='display_name', attrs={'filter-for': 'interface'})) - livesearch = forms.CharField(required=False, label='Device', widget=Livesearch( - query_key='q', query_url='dcim-api:device_list', field_to_update='device') + site = forms.ModelChoiceField( + queryset=Site.objects.all(), + label='Site', + required=False, + widget=forms.Select( + attrs={'filter-for': 'rack'} + ) + ) + rack = forms.ModelChoiceField( + queryset=Rack.objects.all(), + label='Rack', + required=False, + widget=APISelect( + api_url='/api/dcim/racks/?site_id={{site}}', + display_field='display_name', + attrs={'filter-for': 'device', 'nullable': 'true'} + ) + ) + device = forms.ModelChoiceField( + queryset=Device.objects.all(), + label='Device', + required=False, + widget=APISelect( + api_url='/api/dcim/devices/?site_id={{site}}&rack_id={{rack}}', + display_field='display_name', + attrs={'filter-for': 'interface'} + ) + ) + livesearch = forms.CharField( + required=False, + label='Device', + widget=Livesearch( + query_key='q', + query_url='dcim-api:device_list', + field_to_update='device' + ) + ) + interface = forms.ModelChoiceField( + queryset=Interface.objects.all(), + label='Interface', + widget=APISelect( + api_url='/api/dcim/devices/{{device}}/interfaces/' + ) + ) + set_as_primary = forms.BooleanField( + label='Set as primary IP for device', + required=False ) - interface = forms.ModelChoiceField(queryset=Interface.objects.all(), label='Interface', - widget=APISelect(api_url='/api/dcim/devices/{{device}}/interfaces/')) - set_as_primary = forms.BooleanField(label='Set as primary IP for device', required=False) def __init__(self, *args, **kwargs): diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index b53bb82ab..191d33a90 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -559,6 +559,8 @@ def ipaddress_assign(request, pk): device.save() return redirect('ipam:ipaddress', pk=ipaddress.pk) + else: + assert False, form.errors else: form = forms.IPAddressAssignForm() diff --git a/netbox/project-static/js/forms.js b/netbox/project-static/js/forms.js index c86a33fcc..e421f6283 100644 --- a/netbox/project-static/js/forms.js +++ b/netbox/project-static/js/forms.js @@ -77,11 +77,7 @@ $(document).ready(function() { // Wipe out any existing options within the child field and create a default option child_field.empty(); - var default_option = $("").attr("value", "").text("---------"); - if (child_field.attr('nullable') == 'true') { - default_option.attr("value", "0"); - } - child_field.append(default_option); + child_field.append($("").attr("value", "").text("---------")); if ($(this).val() || $(this).attr('nullable') == 'true') { var api_url = child_field.attr('api-url'); @@ -96,7 +92,7 @@ $(document).ready(function() { var filter_field = $('#id_' + match[1]); if (filter_field.val()) { api_url = api_url.replace(match[0], filter_field.val()); - } else { + } else if ($(this).attr('nullable') == 'true') { api_url = api_url.replace(match[0], '0'); } }