.html" as the template, if it exists. Otherwise,
+ # fall back to using base.html.
+ if self.base_template is None:
+ self.base_template = f"{model._meta.app_label}/{model._meta.model_name}.html"
+ # TODO: This can be removed once an object view has been established for every model.
+ try:
+ template.loader.get_template(self.base_template)
+ except template.TemplateDoesNotExist:
+ self.base_template = 'base.html'
return render(request, 'extras/object_changelog.html', {
- object_var: obj,
- 'instance': obj, # We'll eventually standardize on 'instance` for the object variable name
+ 'object': obj,
'table': objectchanges_table,
- 'base_template': base_template,
+ 'base_template': self.base_template,
'active_tab': 'changelog',
})
diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py
index d2248e84c..5769f0a68 100644
--- a/netbox/ipam/views.py
+++ b/netbox/ipam/views.py
@@ -28,26 +28,23 @@ class VRFListView(generic.ObjectListView):
class VRFView(generic.ObjectView):
queryset = VRF.objects.all()
- def get(self, request, pk):
-
- vrf = get_object_or_404(self.queryset, pk=pk)
- prefix_count = Prefix.objects.restrict(request.user, 'view').filter(vrf=vrf).count()
+ def get_extra_context(self, request, instance):
+ prefix_count = Prefix.objects.restrict(request.user, 'view').filter(vrf=instance).count()
import_targets_table = tables.RouteTargetTable(
- vrf.import_targets.prefetch_related('tenant'),
+ instance.import_targets.prefetch_related('tenant'),
orderable=False
)
export_targets_table = tables.RouteTargetTable(
- vrf.export_targets.prefetch_related('tenant'),
+ instance.export_targets.prefetch_related('tenant'),
orderable=False
)
- return render(request, 'ipam/vrf.html', {
- 'vrf': vrf,
+ return {
'prefix_count': prefix_count,
'import_targets_table': import_targets_table,
'export_targets_table': export_targets_table,
- })
+ }
class VRFEditView(generic.ObjectEditView):
@@ -93,23 +90,20 @@ class RouteTargetListView(generic.ObjectListView):
class RouteTargetView(generic.ObjectView):
queryset = RouteTarget.objects.all()
- def get(self, request, pk):
- routetarget = get_object_or_404(self.queryset, pk=pk)
-
+ def get_extra_context(self, request, instance):
importing_vrfs_table = tables.VRFTable(
- routetarget.importing_vrfs.prefetch_related('tenant'),
+ instance.importing_vrfs.prefetch_related('tenant'),
orderable=False
)
exporting_vrfs_table = tables.VRFTable(
- routetarget.exporting_vrfs.prefetch_related('tenant'),
+ instance.exporting_vrfs.prefetch_related('tenant'),
orderable=False
)
- return render(request, 'ipam/routetarget.html', {
- 'routetarget': routetarget,
+ return {
'importing_vrfs_table': importing_vrfs_table,
'exporting_vrfs_table': exporting_vrfs_table,
- })
+ }
class RouteTargetEditView(generic.ObjectEditView):
@@ -206,13 +200,10 @@ class AggregateListView(generic.ObjectListView):
class AggregateView(generic.ObjectView):
queryset = Aggregate.objects.all()
- def get(self, request, pk):
-
- aggregate = get_object_or_404(self.queryset, pk=pk)
-
+ def get_extra_context(self, request, instance):
# Find all child prefixes contained by this aggregate
child_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
- prefix__net_contained_or_equal=str(aggregate.prefix)
+ prefix__net_contained_or_equal=str(instance.prefix)
).prefetch_related(
'site', 'role'
).order_by(
@@ -221,7 +212,7 @@ class AggregateView(generic.ObjectView):
# Add available prefixes to the table if requested
if request.GET.get('show_available', 'true') == 'true':
- child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes)
+ child_prefixes = add_available_prefixes(instance.prefix, child_prefixes)
prefix_table = tables.PrefixDetailTable(child_prefixes)
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
@@ -240,12 +231,11 @@ class AggregateView(generic.ObjectView):
'delete': request.user.has_perm('ipam.delete_prefix'),
}
- return render(request, 'ipam/aggregate.html', {
- 'aggregate': aggregate,
+ return {
'prefix_table': prefix_table,
'permissions': permissions,
'show_available': request.GET.get('show_available', 'true') == 'true',
- })
+ }
class AggregateEditView(generic.ObjectEditView):
@@ -324,22 +314,19 @@ class PrefixListView(generic.ObjectListView):
class PrefixView(generic.ObjectView):
queryset = Prefix.objects.prefetch_related('vrf', 'site__region', 'tenant__group', 'vlan__group', 'role')
- def get(self, request, pk):
-
- prefix = get_object_or_404(self.queryset, pk=pk)
-
+ def get_extra_context(self, request, instance):
try:
aggregate = Aggregate.objects.restrict(request.user, 'view').get(
- prefix__net_contains_or_equals=str(prefix.prefix)
+ prefix__net_contains_or_equals=str(instance.prefix)
)
except Aggregate.DoesNotExist:
aggregate = None
# Parent prefixes table
parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
- Q(vrf=prefix.vrf) | Q(vrf__isnull=True)
+ Q(vrf=instance.vrf) | Q(vrf__isnull=True)
).filter(
- prefix__net_contains=str(prefix.prefix)
+ prefix__net_contains=str(instance.prefix)
).prefetch_related(
'site', 'role'
).annotate_tree()
@@ -348,38 +335,35 @@ class PrefixView(generic.ObjectView):
# Duplicate prefixes table
duplicate_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
- vrf=prefix.vrf, prefix=str(prefix.prefix)
+ vrf=instance.vrf, prefix=str(instance.prefix)
).exclude(
- pk=prefix.pk
+ pk=instance.pk
).prefetch_related(
'site', 'role'
)
duplicate_prefix_table = tables.PrefixTable(list(duplicate_prefixes), orderable=False)
duplicate_prefix_table.exclude = ('vrf',)
- return render(request, 'ipam/prefix.html', {
- 'prefix': prefix,
+ return {
'aggregate': aggregate,
'parent_prefix_table': parent_prefix_table,
'duplicate_prefix_table': duplicate_prefix_table,
- })
+ }
class PrefixPrefixesView(generic.ObjectView):
queryset = Prefix.objects.all()
+ template_name = 'ipam/prefix_prefixes.html'
- def get(self, request, pk):
-
- prefix = get_object_or_404(self.queryset, pk=pk)
-
+ def get_extra_context(self, request, instance):
# Child prefixes table
- child_prefixes = prefix.get_child_prefixes().restrict(request.user, 'view').prefetch_related(
+ child_prefixes = instance.get_child_prefixes().restrict(request.user, 'view').prefetch_related(
'site', 'vlan', 'role',
).annotate_tree()
# Add available prefixes to the table if requested
if child_prefixes and request.GET.get('show_available', 'true') == 'true':
- child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes)
+ child_prefixes = add_available_prefixes(instance.prefix, child_prefixes)
prefix_table = tables.PrefixDetailTable(child_prefixes)
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
@@ -398,32 +382,31 @@ class PrefixPrefixesView(generic.ObjectView):
'delete': request.user.has_perm('ipam.delete_prefix'),
}
- return render(request, 'ipam/prefix_prefixes.html', {
- 'prefix': prefix,
- 'first_available_prefix': prefix.get_first_available_prefix(),
+ bulk_querystring = 'vrf_id={}&within={}'.format(instance.vrf.pk if instance.vrf else '0', instance.prefix)
+
+ return {
+ 'first_available_prefix': instance.get_first_available_prefix(),
'prefix_table': prefix_table,
'permissions': permissions,
- 'bulk_querystring': 'vrf_id={}&within={}'.format(prefix.vrf.pk if prefix.vrf else '0', prefix.prefix),
+ 'bulk_querystring': bulk_querystring,
'active_tab': 'prefixes',
'show_available': request.GET.get('show_available', 'true') == 'true',
- })
+ }
class PrefixIPAddressesView(generic.ObjectView):
queryset = Prefix.objects.all()
+ template_name = 'ipam/prefix_ipaddresses.html'
- def get(self, request, pk):
-
- prefix = get_object_or_404(self.queryset, pk=pk)
-
+ def get_extra_context(self, request, instance):
# Find all IPAddresses belonging to this Prefix
- ipaddresses = prefix.get_child_ips().restrict(request.user, 'view').prefetch_related(
+ ipaddresses = instance.get_child_ips().restrict(request.user, 'view').prefetch_related(
'vrf', 'primary_ip4_for', 'primary_ip6_for'
)
# Add available IP addresses to the table if requested
if request.GET.get('show_available', 'true') == 'true':
- ipaddresses = add_available_ipaddresses(prefix.prefix, ipaddresses, prefix.is_pool)
+ ipaddresses = add_available_ipaddresses(instance.prefix, ipaddresses, instance.is_pool)
ip_table = tables.IPAddressTable(ipaddresses)
if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
@@ -442,15 +425,16 @@ class PrefixIPAddressesView(generic.ObjectView):
'delete': request.user.has_perm('ipam.delete_ipaddress'),
}
- return render(request, 'ipam/prefix_ipaddresses.html', {
- 'prefix': prefix,
- 'first_available_ip': prefix.get_first_available_ip(),
+ bulk_querystring = 'vrf_id={}&parent={}'.format(instance.vrf.pk if instance.vrf else '0', instance.prefix)
+
+ return {
+ 'first_available_ip': instance.get_first_available_ip(),
'ip_table': ip_table,
'permissions': permissions,
- 'bulk_querystring': 'vrf_id={}&parent={}'.format(prefix.vrf.pk if prefix.vrf else '0', prefix.prefix),
+ 'bulk_querystring': bulk_querystring,
'active_tab': 'ip-addresses',
'show_available': request.GET.get('show_available', 'true') == 'true',
- })
+ }
class PrefixEditView(generic.ObjectEditView):
@@ -497,13 +481,11 @@ class IPAddressListView(generic.ObjectListView):
class IPAddressView(generic.ObjectView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
- def get(self, request, pk):
-
- ipaddress = get_object_or_404(self.queryset, pk=pk)
-
+ def get_extra_context(self, request, instance):
# Parent prefixes table
parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
- vrf=ipaddress.vrf, prefix__net_contains=str(ipaddress.address.ip)
+ vrf=instance.vrf,
+ prefix__net_contains=str(instance.address.ip)
).prefetch_related(
'site', 'role'
)
@@ -512,23 +494,24 @@ class IPAddressView(generic.ObjectView):
# Duplicate IPs table
duplicate_ips = IPAddress.objects.restrict(request.user, 'view').filter(
- vrf=ipaddress.vrf, address=str(ipaddress.address)
+ vrf=instance.vrf,
+ address=str(instance.address)
).exclude(
- pk=ipaddress.pk
+ pk=instance.pk
).prefetch_related(
'nat_inside'
)
# Exclude anycast IPs if this IP is anycast
- if ipaddress.role == IPAddressRoleChoices.ROLE_ANYCAST:
+ if instance.role == IPAddressRoleChoices.ROLE_ANYCAST:
duplicate_ips = duplicate_ips.exclude(role=IPAddressRoleChoices.ROLE_ANYCAST)
# Limit to a maximum of 10 duplicates displayed here
duplicate_ips_table = tables.IPAddressTable(duplicate_ips[:10], orderable=False)
# Related IP table
related_ips = IPAddress.objects.restrict(request.user, 'view').exclude(
- address=str(ipaddress.address)
+ address=str(instance.address)
).filter(
- vrf=ipaddress.vrf, address__net_contained_or_equal=str(ipaddress.address)
+ vrf=instance.vrf, address__net_contained_or_equal=str(instance.address)
)
related_ips_table = tables.IPAddressTable(related_ips, orderable=False)
@@ -538,13 +521,12 @@ class IPAddressView(generic.ObjectView):
}
RequestConfig(request, paginate).configure(related_ips_table)
- return render(request, 'ipam/ipaddress.html', {
- 'ipaddress': ipaddress,
+ return {
'parent_prefixes_table': parent_prefixes_table,
'duplicate_ips_table': duplicate_ips_table,
'more_duplicate_ips': duplicate_ips.count() > 10,
'related_ips_table': related_ips_table,
- })
+ }
class IPAddressEditView(generic.ObjectEditView):
@@ -569,6 +551,7 @@ class IPAddressEditView(generic.ObjectEditView):
return obj
+# TODO: Standardize or remove this view
class IPAddressAssignView(generic.ObjectView):
"""
Search for IPAddresses to be assigned to an Interface.
@@ -678,14 +661,13 @@ class VLANGroupBulkDeleteView(generic.BulkDeleteView):
class VLANGroupVLANsView(generic.ObjectView):
queryset = VLANGroup.objects.all()
+ template_name = 'ipam/vlangroup_vlans.html'
- def get(self, request, pk):
- vlan_group = get_object_or_404(self.queryset, pk=pk)
-
- vlans = VLAN.objects.restrict(request.user, 'view').filter(group_id=pk).prefetch_related(
+ def get_extra_context(self, request, instance):
+ vlans = VLAN.objects.restrict(request.user, 'view').filter(group=instance).prefetch_related(
Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user))
)
- vlans = add_available_vlans(vlan_group, vlans)
+ vlans = add_available_vlans(instance, vlans)
vlan_table = tables.VLANDetailTable(vlans)
if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'):
@@ -706,13 +688,12 @@ class VLANGroupVLANsView(generic.ObjectView):
'delete': request.user.has_perm('ipam.delete_vlan'),
}
- return render(request, 'ipam/vlangroup_vlans.html', {
- 'vlan_group': vlan_group,
- 'first_available_vlan': vlan_group.get_next_available_vid(),
- 'bulk_querystring': 'group_id={}'.format(vlan_group.pk),
+ return {
+ 'first_available_vlan': instance.get_next_available_vid(),
+ 'bulk_querystring': f'group_id={instance.pk}',
'vlan_table': vlan_table,
'permissions': permissions,
- })
+ }
#
@@ -729,27 +710,24 @@ class VLANListView(generic.ObjectListView):
class VLANView(generic.ObjectView):
queryset = VLAN.objects.prefetch_related('site__region', 'tenant__group', 'role')
- def get(self, request, pk):
-
- vlan = get_object_or_404(self.queryset, pk=pk)
- prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=vlan).prefetch_related(
+ def get_extra_context(self, request, instance):
+ prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=instance).prefetch_related(
'vrf', 'site', 'role'
)
prefix_table = tables.PrefixTable(list(prefixes), orderable=False)
prefix_table.exclude = ('vlan',)
- return render(request, 'ipam/vlan.html', {
- 'vlan': vlan,
+ return {
'prefix_table': prefix_table,
- })
+ }
class VLANInterfacesView(generic.ObjectView):
queryset = VLAN.objects.all()
+ template_name = 'ipam/vlan_interfaces.html'
- def get(self, request, pk):
- vlan = get_object_or_404(self.queryset, pk=pk)
- interfaces = vlan.get_interfaces().prefetch_related('device')
+ def get_extra_context(self, request, instance):
+ interfaces = instance.get_interfaces().prefetch_related('device')
members_table = tables.VLANDevicesTable(interfaces)
paginate = {
@@ -758,19 +736,18 @@ class VLANInterfacesView(generic.ObjectView):
}
RequestConfig(request, paginate).configure(members_table)
- return render(request, 'ipam/vlan_interfaces.html', {
- 'vlan': vlan,
+ return {
'members_table': members_table,
'active_tab': 'interfaces',
- })
+ }
class VLANVMInterfacesView(generic.ObjectView):
queryset = VLAN.objects.all()
+ template_name = 'ipam/vlan_vminterfaces.html'
- def get(self, request, pk):
- vlan = get_object_or_404(self.queryset, pk=pk)
- interfaces = vlan.get_vminterfaces().prefetch_related('virtual_machine')
+ def get_extra_context(self, request, instance):
+ interfaces = instance.get_vminterfaces().prefetch_related('virtual_machine')
members_table = tables.VLANVirtualMachinesTable(interfaces)
paginate = {
@@ -779,11 +756,10 @@ class VLANVMInterfacesView(generic.ObjectView):
}
RequestConfig(request, paginate).configure(members_table)
- return render(request, 'ipam/vlan_vminterfaces.html', {
- 'vlan': vlan,
+ return {
'members_table': members_table,
'active_tab': 'vminterfaces',
- })
+ }
class VLANEditView(generic.ObjectEditView):
@@ -830,14 +806,6 @@ class ServiceListView(generic.ObjectListView):
class ServiceView(generic.ObjectView):
queryset = Service.objects.prefetch_related('ipaddresses')
- def get(self, request, pk):
-
- service = get_object_or_404(self.queryset, pk=pk)
-
- return render(request, 'ipam/service.html', {
- 'service': service,
- })
-
class ServiceEditView(generic.ObjectEditView):
queryset = Service.objects.prefetch_related('ipaddresses')
diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py
index 7731dfe24..eb7b2542f 100644
--- a/netbox/netbox/views/generic.py
+++ b/netbox/netbox/views/generic.py
@@ -32,9 +32,11 @@ class ObjectView(ObjectPermissionRequiredMixin, View):
"""
Retrieve a single object for display.
- queryset: The base queryset for retrieving the object.
+ queryset: The base queryset for retrieving the object
+ template_name: Name of the template to use
"""
queryset = None
+ template_name = None
def get_required_permission(self):
return get_permission_for_model(self.queryset.model, 'view')
@@ -43,19 +45,29 @@ class ObjectView(ObjectPermissionRequiredMixin, View):
"""
Return self.template_name if set. Otherwise, resolve the template path by model app_label and name.
"""
- if hasattr(self, 'template_name'):
+ if self.template_name is not None:
return self.template_name
model_opts = self.queryset.model._meta
return f'{model_opts.app_label}/{model_opts.model_name}.html'
- def get(self, request, pk):
+ def get_extra_context(self, request, instance):
"""
- Generic GET handler for accessing an object by PK
+ Return any additional context data for the template.
+
+ request: The current request
+ instance: The object being viewed
"""
- instance = get_object_or_404(self.queryset, pk=pk)
+ return {}
+
+ def get(self, request, *args, **kwargs):
+ """
+ Generic GET handler for accessing an object by PK or slug
+ """
+ instance = get_object_or_404(self.queryset, **kwargs)
return render(request, self.get_template_name(), {
- 'instance': instance,
+ 'object': instance,
+ **self.get_extra_context(request, instance),
})
diff --git a/netbox/secrets/views.py b/netbox/secrets/views.py
index 539cbb160..14253486d 100644
--- a/netbox/secrets/views.py
+++ b/netbox/secrets/views.py
@@ -66,14 +66,6 @@ class SecretListView(generic.ObjectListView):
class SecretView(generic.ObjectView):
queryset = Secret.objects.all()
- def get(self, request, pk):
-
- secret = get_object_or_404(self.queryset, pk=pk)
-
- return render(request, 'secrets/secret.html', {
- 'secret': secret,
- })
-
class SecretEditView(generic.ObjectEditView):
queryset = Secret.objects.all()
diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html
index dde053ee0..c104b154b 100644
--- a/netbox/templates/circuits/circuit.html
+++ b/netbox/templates/circuits/circuit.html
@@ -4,15 +4,15 @@
{% load helpers %}
{% load plugins %}
-{% block title %}{{ circuit }}{% endblock %}
+{% block title %}{{ object }}{% endblock %}
{% block header %}
- {% plugin_buttons circuit %}
+ {% plugin_buttons object %}
{% if perms.circuits.add_circuit %}
- {% clone_button circuit %}
+ {% clone_button object %}
{% endif %}
{% if perms.circuits.change_circuit %}
- {% edit_button circuit %}
+ {% edit_button object %}
{% endif %}
{% if perms.circuits.delete_circuit %}
- {% delete_button circuit %}
+ {% delete_button object %}
{% endif %}
- {{ circuit }}
- {% include 'inc/created_updated.html' with obj=circuit %}
+ {{ object }}
+ {% include 'inc/created_updated.html' %}
- {% custom_links circuit %}
+ {% custom_links object %}
@@ -68,31 +68,31 @@
Status
- {{ circuit.get_status_display }}
+ {{ object.get_status_display }}
Provider
- {{ circuit.provider }}
+ {{ object.provider }}
Circuit ID
- {{ circuit.cid }}
+ {{ object.cid }}
Type
- {{ circuit.type }}
+ {{ object.type }}
Tenant
- {% if circuit.tenant %}
- {% if circuit.tenant.group %}
- {{ circuit.tenant.group }} /
+ {% if object.tenant %}
+ {% if object.tenant.group %}
+ {{ object.tenant.group }} /
{% endif %}
- {{ circuit.tenant }}
+ {{ object.tenant }}
{% else %}
None
{% endif %}
@@ -100,43 +100,43 @@
Install Date
- {{ circuit.install_date|placeholder }}
+ {{ object.install_date|placeholder }}
Commit Rate
- {{ circuit.commit_rate|humanize_speed|placeholder }}
+ {{ object.commit_rate|humanize_speed|placeholder }}
Description
- {{ circuit.description|placeholder }}
+ {{ object.description|placeholder }}
- {% include 'inc/custom_fields_panel.html' with obj=circuit %}
- {% include 'extras/inc/tags_panel.html' with tags=circuit.tags.all url='circuits:circuit_list' %}
+ {% include 'inc/custom_fields_panel.html' %}
+ {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='circuits:circuit_list' %}
Comments
- {% if circuit.comments %}
- {{ circuit.comments|render_markdown }}
+ {% if object.comments %}
+ {{ object.comments|render_markdown }}
{% else %}
None
{% endif %}
- {% plugin_left_page circuit %}
+ {% plugin_left_page object %}
{% include 'circuits/inc/circuit_termination.html' with termination=termination_a side='A' %}
{% include 'circuits/inc/circuit_termination.html' with termination=termination_z side='Z' %}
- {% plugin_right_page circuit %}
+ {% plugin_right_page object %}
- {% plugin_full_width_page circuit %}
+ {% plugin_full_width_page object %}
{% endblock %}
diff --git a/netbox/templates/circuits/inc/circuit_termination.html b/netbox/templates/circuits/inc/circuit_termination.html
index aaeb114eb..477788931 100644
--- a/netbox/templates/circuits/inc/circuit_termination.html
+++ b/netbox/templates/circuits/inc/circuit_termination.html
@@ -4,7 +4,7 @@
{% if not termination and perms.circuits.add_circuittermination %}
-
+
Add
{% endif %}
@@ -12,12 +12,12 @@
Edit
-
+
Swap
{% endif %}
{% if termination and perms.circuits.delete_circuittermination %}
-
+
Delete
{% endif %}
@@ -67,10 +67,10 @@
Connect
diff --git a/netbox/templates/circuits/provider.html b/netbox/templates/circuits/provider.html
index a746e4eed..e96d5abcb 100644
--- a/netbox/templates/circuits/provider.html
+++ b/netbox/templates/circuits/provider.html
@@ -5,14 +5,14 @@
{% load helpers %}
{% load plugins %}
-{% block title %}{{ provider }}{% endblock %}
+{% block title %}{{ object }}{% endblock %}
{% block header %}
- {% plugin_buttons provider %}
+ {% plugin_buttons object %}
{% if perms.circuits.add_provider %}
- {% clone_button provider %}
+ {% clone_button object %}
{% endif %}
{% if perms.circuits.change_provider %}
- {% edit_button provider %}
+ {% edit_button object %}
{% endif %}
{% if perms.circuits.delete_provider %}
- {% delete_button provider %}
+ {% delete_button object %}
{% endif %}
-
{{ provider }}
- {% include 'inc/created_updated.html' with obj=provider %}
+
{{ object }}
+ {% include 'inc/created_updated.html' %}
- {% custom_links provider %}
+ {% custom_links object %}
@@ -67,17 +67,17 @@
ASN
- {{ provider.asn|placeholder }}
+ {{ object.asn|placeholder }}
Account
- {{ provider.account|placeholder }}
+ {{ object.account|placeholder }}
Customer Portal
- {% if provider.portal_url %}
- {{ provider.portal_url }}
+ {% if object.portal_url %}
+ {{ object.portal_url }}
{% else %}
—
{% endif %}
@@ -85,35 +85,35 @@
NOC Contact
- {{ provider.noc_contact|render_markdown|placeholder }}
+ {{ object.noc_contact|render_markdown|placeholder }}
Admin Contact
- {{ provider.admin_contact|render_markdown|placeholder }}
+ {{ object.admin_contact|render_markdown|placeholder }}
Circuits
- {{ circuits_table.rows|length }}
+ {{ circuits_table.rows|length }}
- {% include 'inc/custom_fields_panel.html' with obj=provider %}
- {% include 'extras/inc/tags_panel.html' with tags=provider.tags.all url='circuits:provider_list' %}
+ {% include 'inc/custom_fields_panel.html' %}
+ {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='circuits:object_list' %}
Comments
- {% if provider.comments %}
- {{ provider.comments|render_markdown }}
+ {% if object.comments %}
+ {{ object.comments|render_markdown }}
{% else %}
None
{% endif %}
- {% plugin_left_page provider %}
+ {% plugin_left_page object %}
@@ -123,19 +123,19 @@
{% include 'inc/table.html' with table=circuits_table %}
{% if perms.circuits.add_circuit %}
{% endif %}
{% include 'inc/paginator.html' with paginator=circuits_table.paginator page=circuits_table.page %}
- {% plugin_right_page provider %}
+ {% plugin_right_page object %}
- {% plugin_full_width_page provider %}
+ {% plugin_full_width_page object %}
{% endblock %}
diff --git a/netbox/templates/dcim/cable.html b/netbox/templates/dcim/cable.html
index bdae87c48..3bc7869fe 100644
--- a/netbox/templates/dcim/cable.html
+++ b/netbox/templates/dcim/cable.html
@@ -9,31 +9,31 @@
Cables
- {{ cable }}
+ {{ object }}
- {% plugin_buttons cable %}
+ {% plugin_buttons object %}
{% if perms.dcim.change_cable %}
- {% edit_button cable %}
+ {% edit_button object %}
{% endif %}
{% if perms.dcim.delete_cable %}
- {% delete_button cable %}
+ {% delete_button object %}
{% endif %}
- {% block title %}Cable {{ cable }}{% endblock %}
- {% include 'inc/created_updated.html' with obj=cable %}
+ {% block title %}Cable {{ object }}{% endblock %}
+ {% include 'inc/created_updated.html' %}
- {% custom_links cable %}
+ {% custom_links object %}
@@ -49,23 +49,23 @@
Type
- {{ cable.get_type_display|placeholder }}
+ {{ object.get_type_display|placeholder }}
Status
- {{ cable.get_status_display }}
+ {{ object.get_status_display }}
Label
- {{ cable.label|placeholder }}
+ {{ object.label|placeholder }}
Color
- {% if cable.color %}
-
+ {% if object.color %}
+
{% else %}
—
{% endif %}
@@ -74,8 +74,8 @@
Length
- {% if cable.length %}
- {{ cable.length }} {{ cable.get_length_unit_display }}
+ {% if object.length %}
+ {{ object.length }} {{ object.get_length_unit_display }}
{% else %}
—
{% endif %}
@@ -83,29 +83,29 @@
- {% include 'inc/custom_fields_panel.html' with obj=cable %}
- {% include 'extras/inc/tags_panel.html' with tags=cable.tags.all url='dcim:cable_list' %}
- {% plugin_left_page cable %}
+ {% include 'inc/custom_fields_panel.html' %}
+ {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='dcim:cable_list' %}
+ {% plugin_left_page object %}
Termination A
- {% include 'dcim/inc/cable_termination.html' with termination=cable.termination_a %}
+ {% include 'dcim/inc/cable_termination.html' with termination=object.termination_a %}
Termination B
- {% include 'dcim/inc/cable_termination.html' with termination=cable.termination_b %}
+ {% include 'dcim/inc/cable_termination.html' with termination=object.termination_b %}
- {% plugin_right_page cable %}
+ {% plugin_right_page object %}
- {% plugin_full_width_page cable %}
+ {% plugin_full_width_page object %}
{% endblock %}
diff --git a/netbox/templates/dcim/cable_trace.html b/netbox/templates/dcim/cable_trace.html
index 73003954d..a36922612 100644
--- a/netbox/templates/dcim/cable_trace.html
+++ b/netbox/templates/dcim/cable_trace.html
@@ -2,7 +2,7 @@
{% load helpers %}
{% block header %}
- {% block title %}Cable Trace for {{ obj|meta:"verbose_name"|bettertitle }} {{ obj }}{% endblock %}
+ {% block title %}Cable Trace for {{ object|meta:"verbose_name"|bettertitle }} {{ object }}{% endblock %}
{% endblock %}
{% block content %}
diff --git a/netbox/templates/dcim/consoleport.html b/netbox/templates/dcim/consoleport.html
index ebf4a50b8..5d113c86a 100644
--- a/netbox/templates/dcim/consoleport.html
+++ b/netbox/templates/dcim/consoleport.html
@@ -13,71 +13,71 @@
Device
- {{ instance.device }}
+ {{ object.device }}
Name
- {{ instance.name }}
+ {{ object.name }}
Label
- {{ instance.label|placeholder }}
+ {{ object.label|placeholder }}
Type
- {{ instance.get_type_display }}
+ {{ object.get_type_display }}
Description
- {{ instance.description|placeholder }}
+ {{ object.description|placeholder }}
- {% include 'extras/inc/tags_panel.html' with tags=instance.tags.all %}
- {% plugin_left_page instance %}
+ {% include 'extras/inc/tags_panel.html' with tags=object.tags.all %}
+ {% plugin_left_page object %}
Connection
- {% if instance.cable %}
+ {% if object.cable %}
Cable
- {{ instance.cable }}
-
+ {{ object.cable }}
+
- {% if instance.connected_endpoint %}
+ {% if object.connected_endpoint %}
Device
- {{ instance.connected_endpoint.device }}
+ {{ object.connected_endpoint.device }}
Name
- {{ instance.connected_endpoint.name }}
+ {{ object.connected_endpoint.name }}
Type
- {{ instance.connected_endpoint.get_type_display|placeholder }}
+ {{ object.connected_endpoint.get_type_display|placeholder }}
Description
- {{ instance.connected_endpoint.description|placeholder }}
+ {{ object.connected_endpoint.description|placeholder }}
Path Status
- {% if instance.path.is_active %}
+ {% if object.path.is_active %}
Reachable
{% else %}
Not Reachable
@@ -95,21 +95,21 @@
Connect
{% endif %}
{% endif %}
- {% plugin_right_page instance %}
+ {% plugin_right_page object %}
- {% plugin_full_width_page instance %}
+ {% plugin_full_width_page object %}
{% endblock %}
diff --git a/netbox/templates/dcim/consoleserverport.html b/netbox/templates/dcim/consoleserverport.html
index b90231602..b64b4aff2 100644
--- a/netbox/templates/dcim/consoleserverport.html
+++ b/netbox/templates/dcim/consoleserverport.html
@@ -13,71 +13,71 @@
Device
- {{ instance.device }}
+ {{ object.device }}
Name
- {{ instance.name }}
+ {{ object.name }}
Label
- {{ instance.label|placeholder }}
+ {{ object.label|placeholder }}
Type
- {{ instance.get_type_display }}
+ {{ object.get_type_display }}
Description
- {{ instance.description|placeholder }}
+ {{ object.description|placeholder }}
- {% include 'extras/inc/tags_panel.html' with tags=instance.tags.all %}
- {% plugin_left_page instance %}
+ {% include 'extras/inc/tags_panel.html' with tags=object.tags.all %}
+ {% plugin_left_page object %}
Connection
- {% if instance.cable %}
+ {% if object.cable %}
Cable
- {{ instance.cable }}
-
+ {{ object.cable }}
+
- {% if instance.connected_endpoint %}
+ {% if object.connected_endpoint %}
Device
- {{ instance.connected_endpoint.device }}
+ {{ object.connected_endpoint.device }}
Name
- {{ instance.connected_endpoint.name }}
+ {{ object.connected_endpoint.name }}
Type
- {{ instance.connected_endpoint.get_type_display|placeholder }}
+ {{ object.connected_endpoint.get_type_display|placeholder }}
Description
- {{ instance.connected_endpoint.description|placeholder }}
+ {{ object.connected_endpoint.description|placeholder }}
Path Status
- {% if instance.path.is_active %}
+ {% if object.path.is_active %}
Reachable
{% else %}
Not Reachable
@@ -95,21 +95,21 @@
Connect
{% endif %}
{% endif %}
- {% plugin_right_page instance %}
+ {% plugin_right_page object %}
- {% plugin_full_width_page instance %}
+ {% plugin_full_width_page object %}
{% endblock %}
diff --git a/netbox/templates/dcim/device/device.html b/netbox/templates/dcim/device.html
similarity index 83%
rename from netbox/templates/dcim/device/device.html
rename to netbox/templates/dcim/device.html
index 6c9e3a833..97f7c8953 100644
--- a/netbox/templates/dcim/device/device.html
+++ b/netbox/templates/dcim/device.html
@@ -20,20 +20,20 @@
Site
- {% if device.site.region %}
- {{ device.site.region }} /
+ {% if object.site.region %}
+ {{ object.site.region }} /
{% endif %}
- {{ device.site }}
+ {{ object.site }}
Rack
- {% if device.rack %}
- {% if device.rack.group %}
- {{ device.rack.group }} /
+ {% if object.rack %}
+ {% if object.rack.group %}
+ {{ object.rack.group }} /
{% endif %}
- {{ device.rack }}
+ {{ object.rack }}
{% else %}
None
{% endif %}
@@ -42,16 +42,16 @@
Position
- {% if device.parent_bay %}
- {% with device.parent_bay.device as parent %}
- {{ parent }} / {{ device.parent_bay }}
+ {% if object.parent_bay %}
+ {% with object.parent_bay.device as parent %}
+ {{ parent }} / {{ object.parent_bay }}
{% if parent.position %}
(U{{ parent.position }} / {{ parent.get_face_display }})
{% endif %}
{% endwith %}
- {% elif device.rack and device.position %}
- U{{ device.position }} / {{ device.get_face_display }}
- {% elif device.rack and device.device_type.u_height %}
+ {% elif object.rack and object.position %}
+ U{{ object.position }} / {{ object.get_face_display }}
+ {% elif object.rack and object.device_type.u_height %}
Not racked
{% else %}
—
@@ -61,11 +61,11 @@
Tenant
- {% if device.tenant %}
- {% if device.tenant.group %}
- {{ device.tenant.group }} /
+ {% if object.tenant %}
+ {% if object.tenant.group %}
+ {{ object.tenant.group }} /
{% endif %}
- {{ device.tenant }}
+ {{ object.tenant }}
{% else %}
None
{% endif %}
@@ -74,16 +74,16 @@
Device Type
- {{ device.device_type.display_name }} ({{ device.device_type.u_height }}U)
+ {{ object.device_type.display_name }} ({{ object.device_type.u_height }}U)
Serial Number
- {{ device.serial|placeholder }}
+ {{ object.serial|placeholder }}
Asset Tag
- {{ device.asset_tag|placeholder }}
+ {{ object.asset_tag|placeholder }}
@@ -100,18 +100,18 @@
Priority
{% for vc_member in vc_members %}
-
+
{{ vc_member }}
{{ vc_member.vc_position }}
- {% if device.virtual_chassis.master == vc_member %} {% endif %}
+ {% if object.virtual_chassis.master == vc_member %} {% endif %}
{{ vc_member.vc_priority|default:"" }}
{% endfor %}
@@ -125,14 +125,14 @@
Role
- {{ device.device_role }}
+ {{ object.device_role }}
Platform
- {% if device.platform %}
- {{ device.platform }}
+ {% if object.platform %}
+ {{ object.platform }}
{% else %}
None
{% endif %}
@@ -141,18 +141,18 @@
Status
- {{ device.get_status_display }}
+ {{ object.get_status_display }}
Primary IPv4
- {% if device.primary_ip4 %}
- {{ device.primary_ip4.address.ip }}
- {% if device.primary_ip4.nat_inside %}
- (NAT for {{ device.primary_ip4.nat_inside.address.ip }})
- {% elif device.primary_ip4.nat_outside %}
- (NAT: {{ device.primary_ip4.nat_outside.address.ip }})
+ {% if object.primary_ip4 %}
+ {{ object.primary_ip4.address.ip }}
+ {% if object.primary_ip4.nat_inside %}
+ (NAT for {{ object.primary_ip4.nat_inside.address.ip }})
+ {% elif object.primary_ip4.nat_outside %}
+ (NAT: {{ object.primary_ip4.nat_outside.address.ip }})
{% endif %}
{% else %}
—
@@ -162,46 +162,46 @@
Primary IPv6
- {% if device.primary_ip6 %}
- {{ device.primary_ip6.address.ip }}
- {% if device.primary_ip6.nat_inside %}
- (NAT for {{ device.primary_ip6.nat_inside.address.ip }})
- {% elif device.primary_ip6.nat_outside %}
- (NAT: {{ device.primary_ip6.nat_outside.address.ip }})
+ {% if object.primary_ip6 %}
+ {{ object.primary_ip6.address.ip }}
+ {% if object.primary_ip6.nat_inside %}
+ (NAT for {{ object.primary_ip6.nat_inside.address.ip }})
+ {% elif object.primary_ip6.nat_outside %}
+ (NAT: {{ object.primary_ip6.nat_outside.address.ip }})
{% endif %}
{% else %}
—
{% endif %}
- {% if device.cluster %}
+ {% if object.cluster %}
Cluster
- {% if device.cluster.group %}
- {{ device.cluster.group }} /
+ {% if object.cluster.group %}
+ {{ object.cluster.group }} /
{% endif %}
- {{ device.cluster }}
+ {{ object.cluster }}
{% endif %}
- {% include 'inc/custom_fields_panel.html' with obj=device %}
- {% include 'extras/inc/tags_panel.html' with tags=device.tags.all url='dcim:device_list' %}
+ {% include 'inc/custom_fields_panel.html' %}
+ {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='dcim:device_list' %}
Comments
- {% if device.comments %}
- {{ device.comments|render_markdown }}
+ {% if object.comments %}
+ {{ object.comments|render_markdown }}
{% else %}
None
{% endif %}
- {% plugin_left_page device %}
+ {% plugin_left_page object %}
{% if power_ports and poweroutlets %}
@@ -255,7 +255,7 @@
{% include 'secrets/inc/assigned_secrets.html' %}
{% if perms.secrets.add_secret %}
@@ -279,7 +279,7 @@
{% endif %}
{% if perms.ipam.add_service %}
@@ -289,10 +289,10 @@
Images
- {% include 'inc/image_attachments.html' with images=device.images.all %}
+ {% include 'inc/image_attachments.html' with images=object.images.all %}
{% if perms.extras.add_imageattachment %}
- {% plugin_right_page device %}
+ {% plugin_right_page object %}
- {% plugin_full_width_page device %}
+ {% plugin_full_width_page object %}
diff --git a/netbox/templates/dcim/device/base.html b/netbox/templates/dcim/device/base.html
index 80c94a31a..2ee046f91 100644
--- a/netbox/templates/dcim/device/base.html
+++ b/netbox/templates/dcim/device/base.html
@@ -5,19 +5,19 @@
{% load custom_links %}
{% load plugins %}
-{% block title %}{{ device }}{% endblock %}
+{% block title %}{{ object }}{% endblock %}
{% block header %}
- {% plugin_buttons device %}
+ {% plugin_buttons object %}
{% if perms.dcim.change_device %}
@@ -42,123 +42,123 @@
{% endif %}
{% if perms.dcim.add_device %}
- {% clone_button device %}
+ {% clone_button object %}
{% endif %}
{% if perms.dcim.change_device %}
- {% edit_button device %}
+ {% edit_button object %}
{% endif %}
{% if perms.dcim.delete_device %}
- {% delete_button device %}
+ {% delete_button object %}
{% endif %}
- {{ device }}
- {% include 'inc/created_updated.html' with obj=device %}
+ {{ object }}
+ {% include 'inc/created_updated.html' %}
- {% custom_links device %}
+ {% custom_links object %}
diff --git a/netbox/templates/dcim/device/config.html b/netbox/templates/dcim/device/config.html
index 5ef941c60..4b73a2577 100644
--- a/netbox/templates/dcim/device/config.html
+++ b/netbox/templates/dcim/device/config.html
@@ -1,7 +1,7 @@
{% extends 'dcim/device/base.html' %}
{% load static %}
-{% block title %}{{ device }} - Config{% endblock %}
+{% block title %}{{ object }} - Config{% endblock %}
{% block content %}
{% include 'inc/ajax_loader.html' %}
@@ -36,7 +36,7 @@