瀏覽代碼

fix(ipam): Omit None values from AddObject URL parameters

Update AddObject.get_url() to skip parameters that resolve to None,
preventing invalid query strings.
Adjust VLAN-to-Prefix action to use scope_type/scope instead of site
field.

Fixes #22031
Martin Hauser 2 月之前
父節點
當前提交
d01454c753
共有 2 個文件被更改,包括 14 次插入7 次删除
  1. 5 2
      netbox/ipam/views.py
  2. 9 5
      netbox/netbox/ui/actions.py

+ 5 - 2
netbox/ipam/views.py

@@ -1636,8 +1636,11 @@ class VLANView(generic.ObjectView):
                     actions.AddObject(
                         'ipam.prefix',
                         url_params={
-                            'tenant': lambda ctx: ctx['object'].tenant.pk if ctx['object'].tenant else None,
-                            'site': lambda ctx: ctx['object'].site.pk if ctx['object'].site else None,
+                            'tenant': lambda ctx: ctx['object'].tenant_id,
+                            'scope_type': lambda ctx: (
+                                ContentType.objects.get_for_model(Site).pk if ctx['object'].site_id else None
+                            ),
+                            'scope': lambda ctx: ctx['object'].site_id,
                             'vlan': lambda ctx: ctx['object'].pk,
                         },
                         label=_('Add a Prefix'),

+ 9 - 5
netbox/netbox/ui/actions.py

@@ -92,14 +92,18 @@ class LinkAction(PanelAction):
         """
         url = reverse(self.view_name, kwargs=self.view_kwargs)
         if self.url_params:
-            # If the param value is callable, call it with the context and save the result.
-            url_params = {
-                k: v(context) if callable(v) else v for k, v in self.url_params.items()
-            }
+            url_params = {}
+            for key, value in self.url_params.items():
+                # If the param value is callable, call it with the context and save the result.
+                value = value(context) if callable(value) else value
+                # Omit parameters whose value resolved to None
+                if value is not None:
+                    url_params[key] = value
             # Set the return URL if not already set and an object is available.
             if 'return_url' not in url_params and 'object' in context:
                 url_params['return_url'] = context['object'].get_absolute_url()
-            url = f'{url}?{urlencode(url_params)}'
+            if url_params:
+                url = f'{url}?{urlencode(url_params)}'
         return url
 
     def get_context(self, context):