diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py
index 7f99d1ca4..ce600673c 100644
--- a/netbox/dcim/forms/filtersets.py
+++ b/netbox/dcim/forms/filtersets.py
@@ -643,7 +643,7 @@ class DeviceFilterForm(
(None, ('q', 'filter_id', 'tag')),
(_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
(_('Operation'), ('status', 'role_id', 'airflow', 'serial', 'asset_tag', 'mac_address')),
- (_('Hardware'), ('manufacturer_id', 'device_type_id', 'platform_id')),
+ (_('Hardware'), ('manufacturer_id', 'platform_id', 'device_type_id')),
(_('Tenant'), ('tenant_group_id', 'tenant_id')),
(_('Contacts'), ('contact', 'contact_role', 'contact_group')),
(_('Components'), (
@@ -713,7 +713,10 @@ class DeviceFilterForm(
queryset=Platform.objects.all(),
required=False,
null_option='None',
- label=_('Platform')
+ label=_('Platform'),
+ query_params={
+ "manufacturer_id": '$manufacturer_id'
+ }
)
status = forms.MultipleChoiceField(
label=_('Status'),
diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py
index 93e214598..d465f214c 100644
--- a/netbox/dcim/forms/model_forms.py
+++ b/netbox/dcim/forms/model_forms.py
@@ -439,10 +439,21 @@ class DeviceForm(TenancyForm, NetBoxModelForm):
label=_('Device role'),
queryset=DeviceRole.objects.all()
)
+ manufacturer = DynamicModelChoiceField(
+ label=_('Manufacturer'),
+ queryset=Manufacturer.objects.all(),
+ required=False,
+ initial_params={
+ 'platforms': '$platform'
+ }
+ )
platform = DynamicModelChoiceField(
label=_('Platform'),
queryset=Platform.objects.all(),
- required=False
+ required=False,
+ query_params={
+ "manufacturer_id": '$manufacturer'
+ }
)
cluster = DynamicModelChoiceField(
label=_('Cluster'),
diff --git a/netbox/templates/dcim/device_edit.html b/netbox/templates/dcim/device_edit.html
index 4dbb2f477..af448c2f2 100644
--- a/netbox/templates/dcim/device_edit.html
+++ b/netbox/templates/dcim/device_edit.html
@@ -64,6 +64,7 @@
{% trans "Management" %}
{% render_field form.status %}
+ {% render_field form.manufacturer %}
{% render_field form.platform %}
{% render_field form.config_template %}
{% if object.pk %}
diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py
index 99ac0cb77..91d9f0375 100644
--- a/netbox/virtualization/forms/filtersets.py
+++ b/netbox/virtualization/forms/filtersets.py
@@ -1,7 +1,7 @@
from django import forms
from django.utils.translation import gettext_lazy as _
-from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup
+from dcim.models import Device, DeviceRole, Manufacturer, Platform, Region, Site, SiteGroup
from extras.forms import LocalConfigContextFilterForm
from extras.models import ConfigTemplate
from ipam.models import L2VPN, VRF
@@ -94,7 +94,7 @@ class VirtualMachineFilterForm(
(None, ('q', 'filter_id', 'tag')),
(_('Cluster'), ('cluster_group_id', 'cluster_type_id', 'cluster_id', 'device_id')),
(_('Location'), ('region_id', 'site_group_id', 'site_id')),
- (_('Attributes'), ('status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', 'local_context_data')),
+ (_('Attributes'), ('status', 'role_id', 'manufacturer_id', 'platform_id', 'mac_address', 'has_primary_ip', 'config_template_id', 'local_context_data')),
(_('Tenant'), ('tenant_group_id', 'tenant_id')),
(_('Contacts'), ('contact', 'contact_role', 'contact_group')),
)
@@ -154,11 +154,19 @@ class VirtualMachineFilterForm(
choices=VirtualMachineStatusChoices,
required=False
)
+ manufacturer_id = DynamicModelMultipleChoiceField(
+ queryset=Manufacturer.objects.all(),
+ required=False,
+ label=_('Manufacturer'),
+ )
platform_id = DynamicModelMultipleChoiceField(
queryset=Platform.objects.all(),
required=False,
null_option='None',
- label=_('Platform')
+ label=_('Platform'),
+ query_params = {
+ "manufacturer_id": '$manufacturer_id'
+ }
)
mac_address = forms.CharField(
required=False,
diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py
index 21dbc895a..3c03bc96a 100644
--- a/netbox/virtualization/forms/model_forms.py
+++ b/netbox/virtualization/forms/model_forms.py
@@ -4,7 +4,7 @@ from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from dcim.forms.common import InterfaceCommonForm
-from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup
+from dcim.models import Device, DeviceRole, Manufacturer, Platform, Rack, Region, Site, SiteGroup
from extras.models import ConfigTemplate
from ipam.models import IPAddress, VLAN, VLANGroup, VRF
from netbox.forms import NetBoxModelForm
@@ -197,10 +197,21 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm):
"vm_role": "True"
}
)
+ manufacturer = DynamicModelChoiceField(
+ label=_('Manufacturer'),
+ queryset=Manufacturer.objects.all(),
+ required=False,
+ initial_params={
+ 'platforms': '$platform'
+ }
+ )
platform = DynamicModelChoiceField(
label=_('Platform'),
queryset=Platform.objects.all(),
- required=False
+ required=False,
+ query_params={
+ "manufacturer_id": '$manufacturer'
+ }
)
local_context_data = JSONField(
required=False,
@@ -217,7 +228,7 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm):
(_('Virtual Machine'), ('name', 'role', 'status', 'description', 'tags')),
(_('Site/Cluster'), ('site', 'cluster', 'device')),
(_('Tenancy'), ('tenant_group', 'tenant')),
- (_('Management'), ('platform', 'primary_ip4', 'primary_ip6', 'config_template')),
+ (_('Management'), ('manufacturer', 'platform', 'primary_ip4', 'primary_ip6', 'config_template')),
(_('Resources'), ('vcpus', 'memory', 'disk')),
(_('Config Context'), ('local_context_data',)),
)