From d9aab6bbe2729749c3494661a33f591845c76c77 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 24 Nov 2025 15:40:06 -0500 Subject: [PATCH] Fixes #20859: Handle dashboard widget exceptions (#20870) --- netbox/extras/dashboard/widgets.py | 5 ++++- netbox/extras/templatetags/dashboard.py | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index f88490ad2..935e48051 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -209,7 +209,10 @@ class ObjectCountsWidget(DashboardWidget): 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) diff --git a/netbox/extras/templatetags/dashboard.py b/netbox/extras/templatetags/dashboard.py index 4ac31abcf..67fa4024c 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 @@ register = template.Library() 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}

+ """)