diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 0a1215370..d62af7681 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -19,6 +19,7 @@ from utilities.forms.fields import ( CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField, ) +from utilities.forms.widgets import ArrayWidget from virtualization.models import Cluster, ClusterGroup, ClusterType @@ -84,11 +85,18 @@ class CustomFieldForm(BootstrapMixin, forms.ModelForm): class CustomFieldChoiceSetForm(BootstrapMixin, forms.ModelForm): + extra_choices = forms.CharField( + widget=ArrayWidget(), + help_text=_('Enter one choice per line.') + ) class Meta: model = CustomFieldChoiceSet fields = ('name', 'description', 'extra_choices', 'order_alphabetically') + def clean_extra_choices(self): + return self.cleaned_data['extra_choices'].split('\n') + class CustomLinkForm(BootstrapMixin, forms.ModelForm): content_types = ContentTypeMultipleChoiceField( diff --git a/netbox/utilities/forms/widgets/misc.py b/netbox/utilities/forms/widgets/misc.py index ca2e64319..e999af831 100644 --- a/netbox/utilities/forms/widgets/misc.py +++ b/netbox/utilities/forms/widgets/misc.py @@ -1,6 +1,7 @@ from django import forms __all__ = ( + 'ArrayWidget', 'ClearableFileInput', 'MarkdownWidget', 'NumberWithOptions', @@ -43,3 +44,13 @@ class SlugWidget(forms.TextInput): Subclass TextInput and add a slug regeneration button next to the form field. """ template_name = 'widgets/sluginput.html' + + +class ArrayWidget(forms.Textarea): + """ + Render each item of an array on a new line within a textarea for easy editing/ + """ + def format_value(self, value): + if value is None or not len(value): + return None + return '\n'.join(value)