diff --git a/docs/release-notes/version-3.2.md b/docs/release-notes/version-3.2.md
index db52f0150..8b3574699 100644
--- a/docs/release-notes/version-3.2.md
+++ b/docs/release-notes/version-3.2.md
@@ -159,6 +159,7 @@ Where it is desired to limit the range of available VLANs within a group, users
* [#8764](https://github.com/netbox-community/netbox/issues/8764) - Correct view name resolution for dynamic form fields
* [#8791](https://github.com/netbox-community/netbox/issues/8791) - Fix display of form validation failures during device component creation
* [#8792](https://github.com/netbox-community/netbox/issues/8792) - Fix creation of circuit terminations via UI
+* [#8815](https://github.com/netbox-community/netbox/issues/8815) - Fix display of custom object fields in table columns
### Other Changes
diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py
index 5ec84d5b6..6cad42514 100644
--- a/netbox/netbox/tables/columns.py
+++ b/netbox/netbox/tables/columns.py
@@ -361,27 +361,35 @@ class CustomFieldColumn(tables.Column):
super().__init__(*args, **kwargs)
+ @staticmethod
+ def _likify_item(item):
+ if hasattr(item, 'get_absolute_url'):
+ return f'{item}'
+ return item
+
def render(self, value):
- if isinstance(value, list):
- return ', '.join(v for v in value)
- elif self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is True:
+ if self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is True:
return mark_safe('')
- elif self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is False:
+ if self.customfield.type == CustomFieldTypeChoices.TYPE_BOOLEAN and value is False:
return mark_safe('')
- elif self.customfield.type == CustomFieldTypeChoices.TYPE_URL:
+ if self.customfield.type == CustomFieldTypeChoices.TYPE_URL:
return mark_safe(f'{value}')
+ if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTISELECT:
+ return ', '.join(v for v in value)
+ if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
+ return mark_safe(', '.join([
+ self._likify_item(obj) for obj in self.customfield.deserialize(value)
+ ]))
if value is not None:
obj = self.customfield.deserialize(value)
- if hasattr(obj, 'get_absolute_url'):
- return mark_safe(f'{obj}')
- return obj
+ return mark_safe(self._likify_item(obj))
return self.default
def value(self, value):
if isinstance(value, list):
- return ','.join(v for v in value)
+ return ','.join(str(v) for v in self.customfield.deserialize(value))
if value is not None:
- return value
+ return self.customfield.deserialize(value)
return self.default