/', include(get_model_urls('extras', 'customfieldchoiceset'))),
+
# Custom links
path('custom-links/', views.CustomLinkListView.as_view(), name='customlink_list'),
path('custom-links/add/', views.CustomLinkEditView.as_view(), name='customlink_add'),
diff --git a/netbox/extras/views.py b/netbox/extras/views.py
index 931e9509c..193d8821b 100644
--- a/netbox/extras/views.py
+++ b/netbox/extras/views.py
@@ -34,7 +34,7 @@ from .scripts import run_script
#
class CustomFieldListView(generic.ObjectListView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
filterset = filtersets.CustomFieldFilterSet
filterset_form = forms.CustomFieldFilterForm
table = tables.CustomFieldTable
@@ -42,38 +42,83 @@ class CustomFieldListView(generic.ObjectListView):
@register_model_view(CustomField)
class CustomFieldView(generic.ObjectView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
@register_model_view(CustomField, 'edit')
class CustomFieldEditView(generic.ObjectEditView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
form = forms.CustomFieldForm
@register_model_view(CustomField, 'delete')
class CustomFieldDeleteView(generic.ObjectDeleteView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
class CustomFieldBulkImportView(generic.BulkImportView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
model_form = forms.CustomFieldImportForm
class CustomFieldBulkEditView(generic.BulkEditView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
filterset = filtersets.CustomFieldFilterSet
table = tables.CustomFieldTable
form = forms.CustomFieldBulkEditForm
class CustomFieldBulkDeleteView(generic.BulkDeleteView):
- queryset = CustomField.objects.all()
+ queryset = CustomField.objects.select_related('choice_set')
filterset = filtersets.CustomFieldFilterSet
table = tables.CustomFieldTable
+#
+# Custom field choices
+#
+
+class CustomFieldChoiceSetListView(generic.ObjectListView):
+ queryset = CustomFieldChoiceSet.objects.all()
+ filterset = filtersets.CustomFieldChoiceSetFilterSet
+ filterset_form = forms.CustomFieldChoiceSetFilterForm
+ table = tables.CustomFieldChoiceSetTable
+
+
+@register_model_view(CustomFieldChoiceSet)
+class CustomFieldChoiceSetView(generic.ObjectView):
+ queryset = CustomFieldChoiceSet.objects.all()
+
+
+@register_model_view(CustomFieldChoiceSet, 'edit')
+class CustomFieldChoiceSetEditView(generic.ObjectEditView):
+ queryset = CustomFieldChoiceSet.objects.all()
+ form = forms.CustomFieldChoiceSetForm
+
+
+@register_model_view(CustomFieldChoiceSet, 'delete')
+class CustomFieldChoiceSetDeleteView(generic.ObjectDeleteView):
+ queryset = CustomFieldChoiceSet.objects.all()
+
+
+class CustomFieldChoiceSetBulkImportView(generic.BulkImportView):
+ queryset = CustomFieldChoiceSet.objects.all()
+ model_form = forms.CustomFieldChoiceSetImportForm
+
+
+class CustomFieldChoiceSetBulkEditView(generic.BulkEditView):
+ queryset = CustomFieldChoiceSet.objects.all()
+ filterset = filtersets.CustomFieldChoiceSetFilterSet
+ table = tables.CustomFieldChoiceSetTable
+ form = forms.CustomFieldChoiceSetBulkEditForm
+
+
+class CustomFieldChoiceSetBulkDeleteView(generic.BulkDeleteView):
+ queryset = CustomFieldChoiceSet.objects.all()
+ filterset = filtersets.CustomFieldChoiceSetFilterSet
+ table = tables.CustomFieldChoiceSetTable
+
+
#
# Custom links
#
diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py
index 100de16da..1f6853884 100644
--- a/netbox/netbox/navigation/menu.py
+++ b/netbox/netbox/navigation/menu.py
@@ -288,6 +288,7 @@ CUSTOMIZATION_MENU = Menu(
label=_('Customization'),
items=(
get_model_item('extras', 'customfield', _('Custom Fields')),
+ get_model_item('extras', 'customfieldchoiceset', _('Custom Field Choices')),
get_model_item('extras', 'customlink', _('Custom Links')),
get_model_item('extras', 'exporttemplate', _('Export Templates')),
get_model_item('extras', 'savedfilter', _('Saved Filters')),
diff --git a/netbox/templates/extras/customfield.html b/netbox/templates/extras/customfield.html
index b783c8a77..bab207243 100644
--- a/netbox/templates/extras/customfield.html
+++ b/netbox/templates/extras/customfield.html
@@ -15,14 +15,6 @@
Name |
{{ object.name }} |
-
- Label |
- {{ object.label|placeholder }} |
-
-
- Group Name |
- {{ object.group_name|placeholder }} |
-
Type |
@@ -30,6 +22,14 @@
{% if object.object_type %}({{ object.object_type.model|bettertitle }}){% endif %}
|
+
+ Label |
+ {{ object.label|placeholder }} |
+
+
+ Group |
+ {{ object.group_name|placeholder }} |
+
Description |
{{ object.description|markdown|placeholder }} |
@@ -38,6 +38,27 @@
Required |
{% checkmark object.required %} |
+
+ Cloneable |
+ {% checkmark object.is_cloneable %} |
+
+ {% if object.choice_set %}
+
+ Choice Set |
+ {{ object.choice_set|linkify }} ({{ object.choice_set.choices|length }} choices) |
+
+ {% endif %}
+
+ Default Value |
+ {{ object.default }} |
+
+
+
+
+
+
+
+
Search Weight |
@@ -60,33 +81,6 @@
| UI Visibility |
{{ object.get_ui_visibility_display }} |
-
- Cloneable |
- {% checkmark object.is_cloneable %} |
-
-
-
-
-
-
-
-
-
- Default Value |
- {{ object.default }} |
-
-
- Choices |
-
- {% if object.choices %}
- {{ object.choices|join:", " }}
- {% else %}
- {{ ''|placeholder }}
- {% endif %}
- |
-
@@ -94,9 +88,7 @@
-
+
{% for ct in object.content_types.all %}
@@ -108,9 +100,7 @@
-
+
@@ -138,8 +128,8 @@
-
- {% plugin_full_width_page object %}
-
+
+ {% plugin_full_width_page object %}
+
{% endblock %}
diff --git a/netbox/templates/extras/customfieldchoiceset.html b/netbox/templates/extras/customfieldchoiceset.html
new file mode 100644
index 000000000..f2df0f67f
--- /dev/null
+++ b/netbox/templates/extras/customfieldchoiceset.html
@@ -0,0 +1,50 @@
+{% extends 'generic/object.html' %}
+{% load helpers %}
+{% load plugins %}
+
+{% block content %}
+
+
+
+
+
+
+
+ Name |
+ {{ object.name }} |
+
+
+ Description |
+ {{ object.description|markdown|placeholder }} |
+
+
+ Used by |
+ {# TODO #} |
+
+
+
+
+ {% plugin_left_page object %}
+
+
+
+
+
+
+ {% for choice in object.choices %}
+
+ {{ choice }} |
+
+ {% endfor %}
+
+
+
+ {% plugin_right_page object %}
+
+
+
+
+ {% plugin_full_width_page object %}
+
+
+{% endblock %}