From 6182c0cb95c44939e5ebf55456fabdceacda99b1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 24 Nov 2025 09:54:59 -0500 Subject: [PATCH 1/2] Fixes #20859: Object counts widget should handle models without restrict() --- netbox/extras/dashboard/widgets.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index f88490ad266..935e480514e 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -209,7 +209,10 @@ def render(self, request): url = get_action_url(model, action='list') except NoReverseMatch: url = None - qs = model.objects.restrict(request.user, 'view') + try: + qs = model.objects.restrict(request.user, 'view') + except AttributeError: + qs = model.objects.all() # Apply any specified filters if url and (filters := self.config.get('filters')): params = dict_to_querydict(filters) From 15e6ae6ccad186197539841c97ebf175309c3370 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 24 Nov 2025 09:55:51 -0500 Subject: [PATCH 2/2] Handle cleanly exceptions raised during widget rendering --- netbox/extras/templatetags/dashboard.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/netbox/extras/templatetags/dashboard.py b/netbox/extras/templatetags/dashboard.py index 4ac31abcf5e..67fa4024cc6 100644 --- a/netbox/extras/templatetags/dashboard.py +++ b/netbox/extras/templatetags/dashboard.py @@ -1,4 +1,6 @@ from django import template +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ register = template.Library() @@ -8,4 +10,16 @@ def render_widget(context, widget): request = context['request'] - return widget.render(request) + try: + return widget.render(request) + except Exception as e: + message1 = _('An error was encountered when attempting to render this widget:') + message2 = _('Please try reconfiguring the widget, or remove it from your dashboard.') + return mark_safe(f""" +

+ + {message1} +

+

{e}

+

{message2}

+ """)