diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md
index 2f8f9fa35..da9346207 100644
--- a/docs/release-notes/version-3.1.md
+++ b/docs/release-notes/version-3.1.md
@@ -5,6 +5,7 @@
### Enhancements
* [#6782](https://github.com/netbox-community/netbox/issues/6782) - Enable the inclusion of custom links in tables
+* [#7600](https://github.com/netbox-community/netbox/issues/7600) - Include count of available IPs on prefix view
* [#8100](https://github.com/netbox-community/netbox/issues/8100) - Add "other" choice for FHRP group protocol
* [#8175](https://github.com/netbox-community/netbox/issues/8175) - Display parent object when attaching an image
diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py
index 4a4aef28f..317caeaf2 100644
--- a/netbox/ipam/views.py
+++ b/netbox/ipam/views.py
@@ -418,7 +418,7 @@ class PrefixView(generic.ObjectView):
).filter(
prefix__net_contains=str(instance.prefix)
).prefetch_related(
- 'site', 'role'
+ 'site', 'role', 'tenant'
)
parent_prefix_table = tables.PrefixTable(
list(parent_prefixes),
diff --git a/netbox/templates/ipam/prefix.html b/netbox/templates/ipam/prefix.html
index eaea4e1ec..c7c0a441e 100644
--- a/netbox/templates/ipam/prefix.html
+++ b/netbox/templates/ipam/prefix.html
@@ -4,127 +4,160 @@
{% block content %}
-
-
-
-
-
-
- Family |
- IPv{{ object.family }} |
-
-
- VRF |
-
- {% if object.vrf %}
- {{ object.vrf }} ({{ object.vrf.rd }})
- {% else %}
- Global
- {% endif %}
- |
-
-
- Tenant |
-
- {% if object.tenant %}
- {% if object.tenant.group %}
- {{ object.tenant.group }} /
- {% endif %}
- {{ object.tenant }}
- {% else %}
- None
- {% endif %}
- |
-
-
- Aggregate |
-
- {% if aggregate %}
- {{ aggregate.prefix }} ({{ aggregate.rir }})
- {% else %}
- None
- {% endif %}
- |
-
-
- Site |
-
- {% if object.site %}
- {% if object.site.region %}
- {{ object.site.region }} /
- {% endif %}
- {{ object.site }}
- {% else %}
- None
- {% endif %}
- |
-
-
- VLAN |
-
- {% if object.vlan %}
- {% if object.vlan.group %}
- {{ object.vlan.group }} /
- {% endif %}
- {{ object.vlan }}
- {% else %}
- None
- {% endif %}
- |
-
-
- Status |
-
- {{ object.get_status_display }}
- |
-
-
- Role |
-
- {% if object.role %}
- {{ object.role }}
- {% else %}
- None
- {% endif %}
- |
-
-
- Description |
- {{ object.description|placeholder }} |
-
-
- Is a pool |
-
- {% if object.is_pool %}
-
- {% else %}
-
- {% endif %}
- |
-
-
- Utilization |
-
- {% if object.mark_utilized %}
- {% utilization_graph 100 warning_threshold=0 danger_threshold=0 %}
- (Marked fully utilized)
- {% else %}
- {% utilization_graph object.get_utilization %}
- {% endif %}
- |
-
-
-
-
- {% plugin_left_page object %}
+
+
+
+
+
+
+ Family |
+ IPv{{ object.family }} |
+
+
+ VRF |
+
+ {% if object.vrf %}
+ {{ object.vrf }} ({{ object.vrf.rd }})
+ {% else %}
+ Global
+ {% endif %}
+ |
+
+
+ Tenant |
+
+ {% if object.tenant %}
+ {% if object.tenant.group %}
+ {{ object.tenant.group }} /
+ {% endif %}
+ {{ object.tenant }}
+ {% else %}
+ None
+ {% endif %}
+ |
+
+
+ Aggregate |
+
+ {% if aggregate %}
+ {{ aggregate.prefix }} ({{ aggregate.rir }})
+ {% else %}
+ None
+ {% endif %}
+ |
+
+
+ Site |
+
+ {% if object.site %}
+ {% if object.site.region %}
+ {{ object.site.region }} /
+ {% endif %}
+ {{ object.site }}
+ {% else %}
+ None
+ {% endif %}
+ |
+
+
+ VLAN |
+
+ {% if object.vlan %}
+ {% if object.vlan.group %}
+ {{ object.vlan.group }} /
+ {% endif %}
+ {{ object.vlan }}
+ {% else %}
+ None
+ {% endif %}
+ |
+
+
+ Status |
+
+ {{ object.get_status_display }}
+ |
+
+
+ Role |
+
+ {% if object.role %}
+ {{ object.role }}
+ {% else %}
+ None
+ {% endif %}
+ |
+
+
+ Description |
+ {{ object.description|placeholder }} |
+
+
+ Is a pool |
+
+ {% if object.is_pool %}
+
+ {% else %}
+
+ {% endif %}
+ |
+
+
+
-
- {% include 'inc/panels/custom_fields.html' %}
- {% include 'inc/panels/tags.html' %}
- {% plugin_right_page object %}
+ {% plugin_left_page object %}
+
+
+
+
+
+
+
+ Utilization |
+
+ {% if object.mark_utilized %}
+ {% utilization_graph 100 warning_threshold=0 danger_threshold=0 %}
+ (Marked fully utilized)
+ {% else %}
+ {% utilization_graph object.get_utilization %}
+ {% endif %}
+ |
+
+ {% with child_ip_count=object.get_child_ips.count %}
+
+ Child IPs |
+
+ {{ child_ip_count }}
+ |
+
+
+ Available IPs |
+ {{ object.get_available_ips|length }} |
+
+ {% endwith %}
+
+ First available IP |
+
+ {% with first_available_ip=object.get_first_available_ip %}
+ {% if first_available_ip %}
+ {% if perms.ipam.add_ipaddress %}
+ {{ first_available_ip }}
+ {% else %}
+ {{ first_available_ip }}
+ {% endif %}
+ {% else %}
+ None
+ {% endif %}
+ {% endwith %}
+ |
+
+
+
+ {% include 'inc/panels/custom_fields.html' %}
+ {% include 'inc/panels/tags.html' %}
+ {% plugin_right_page object %}
+