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');
}
}