diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 21b582c19..a34261342 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -613,6 +613,31 @@ class TableConfig(CloningMixin, ChangeLoggedModel): items.append((col, ascending)) return items + def clean(self): + super().clean() + + # Validate table + if self.table_class is None: + raise ValidationError({ + 'table': _("Unknown table: {name}").format(name=self.table) + }) + + table = self.table_class([]) + + # Validate ordering columns + for name in self.ordering: + if name not in table.columns: + raise ValidationError({ + 'ordering': _('Unknown column: {name}').format(name=name) + }) + + # Validate selected columns + for name in self.columns: + if name not in table.columns: + raise ValidationError({ + 'columns': _('Unknown column: {name}').format(name=name) + }) + class ImageAttachment(ChangeLoggedModel): """ diff --git a/netbox/templates/extras/tableconfig_edit.html b/netbox/templates/extras/tableconfig_edit.html index ce39904f2..8bd701dd4 100644 --- a/netbox/templates/extras/tableconfig_edit.html +++ b/netbox/templates/extras/tableconfig_edit.html @@ -3,49 +3,46 @@ {% load i18n %} {% block form %} - {% render_errors form %} - -
-
-

{% trans "Device" %}

-
- {% render_field form.name %} - {% render_field form.object_type %} - {% render_field form.table %} - {% render_field form.description %} - {% render_field form.weight %} - {% render_field form.enabled %} - {% render_field form.shared %} - {% render_field form.ordering %} +
+
+

{% trans "Device" %}

- -
-
-
- {{ form.available_columns.label }} - {{ form.available_columns }} -
- -
- {{ form.columns.label }} - {{ form.columns }} - - {% trans "Move Up" %} - - - {% trans "Move Down" %} - -
-
+ {% render_field form.name %} + {% render_field form.object_type %} + {% render_field form.table %} + {% render_field form.description %} + {% render_field form.weight %} + {% render_field form.enabled %} + {% render_field form.shared %} + {% render_field form.ordering %}
+
+
+
+ {{ form.available_columns.label }} + {{ form.available_columns }} +
+ +
+ {{ form.columns.label }} + {{ form.columns }} + + {% trans "Move Up" %} + + + {% trans "Move Down" %} + +
+
+
{% endblock %} diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index 8d2b260d5..b90685c9f 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -13,7 +13,10 @@ __all__ = ( def get_table_for_model(model, name=None): name = name or f'{model.__name__}Table' - return import_string(f'{model._meta.app_label}.tables.{name}') + try: + return import_string(f'{model._meta.app_label}.tables.{name}') + except ImportError: + return def get_table_ordering(request, table):