diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md
index dba962b9f..61618b0f1 100644
--- a/docs/release-notes/version-3.1.md
+++ b/docs/release-notes/version-3.1.md
@@ -24,6 +24,7 @@
* [#7768](https://github.com/netbox-community/netbox/issues/7768) - Validate IP address status when creating a new FHRP group
* [#7771](https://github.com/netbox-community/netbox/issues/7771) - Group assignment should be optional when creating contacts via REST API
* [#7849](https://github.com/netbox-community/netbox/issues/7849) - Fix exception when creating an FHRPGroup with an invalid IP address
+* [#7880](https://github.com/netbox-community/netbox/issues/7880) - Include assigned IP addresses in FHRP group object representation
### REST API Changes
diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py
index 12b0fe4a2..ccca32be8 100644
--- a/netbox/dcim/tables/template_code.py
+++ b/netbox/dcim/tables/template_code.py
@@ -53,7 +53,7 @@ INTERFACE_IPADDRESSES = """
INTERFACE_FHRPGROUPS = """
"""
diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py
index 5e40a2081..cdb40333d 100644
--- a/netbox/ipam/api/views.py
+++ b/netbox/ipam/api/views.py
@@ -138,6 +138,7 @@ class FHRPGroupViewSet(CustomFieldModelViewSet):
queryset = FHRPGroup.objects.prefetch_related('ip_addresses', 'tags')
serializer_class = serializers.FHRPGroupSerializer
filterset_class = filtersets.FHRPGroupFilterSet
+ brief_prefetch_fields = ('ip_addresses',)
class FHRPGroupAssignmentViewSet(CustomFieldModelViewSet):
diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py
index fe8c80b6b..0a099499f 100644
--- a/netbox/ipam/models/fhrp.py
+++ b/netbox/ipam/models/fhrp.py
@@ -56,7 +56,17 @@ class FHRPGroup(PrimaryModel):
verbose_name = 'FHRP group'
def __str__(self):
- return f'{self.get_protocol_display()} group {self.group_id}'
+ name = f'{self.get_protocol_display()}: {self.group_id}'
+
+ # Append the list of assigned IP addresses to serve as an additional identifier
+ if self.pk:
+ ip_addresses = [
+ str(ip.address) for ip in self.ip_addresses.all()
+ ]
+ if ip_addresses:
+ return f"{name} ({', '.join(ip_addresses)})"
+
+ return name
def get_absolute_url(self):
return reverse('ipam:fhrpgroup', args=[self.pk])
diff --git a/netbox/templates/ipam/fhrpgroup.html b/netbox/templates/ipam/fhrpgroup.html
index 0ee94ab90..32ed1fc1c 100644
--- a/netbox/templates/ipam/fhrpgroup.html
+++ b/netbox/templates/ipam/fhrpgroup.html
@@ -3,6 +3,9 @@
{% load plugins %}
{% load render_table from django_tables2 %}
+{# Omit assigned IP addresses from object representation #}
+{% block title %}{{ object.get_protocol_display }}: {{ object.group_id }}{% endblock %}
+
{% block breadcrumbs %}
{{ block.super }}
{{ object.get_protocol_display }}