ScriptVar subclasses indicate whether they support multiple values, and ScriptForm honors that

This commit is contained in:
Sander Steffann 2020-05-22 20:19:46 +02:00
parent cd236aa886
commit 32094643f9
2 changed files with 22 additions and 0 deletions

View File

@ -1,6 +1,7 @@
from django import forms
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.utils.datastructures import MultiValueDict
from mptt.forms import TreeNodeMultipleChoiceField
from taggit.forms import TagField as TagField_
@ -431,6 +432,23 @@ class ScriptForm(BootstrapMixin, forms.Form):
)
def __init__(self, vars, *args, commit_default=True, **kwargs):
from .scripts import MultiObjectVar
if 'initial' in kwargs:
orig_initial = kwargs['initial']
if isinstance(orig_initial, MultiValueDict):
# Convert MultiValueDict to a normal dict with single or multiple values based on the field type
new_initial = {}
for name in orig_initial:
var = vars.get(name)
if var and var.multiple_values:
# Force MultiValueDict to give us the list of values
new_initial[name] = orig_initial.getlist(name)
else:
# By default MultiValueDict gives us the last value
new_initial[name] = orig_initial.get(name)
kwargs['initial'] = new_initial
super().__init__(*args, **kwargs)

View File

@ -50,6 +50,9 @@ class ScriptVariable:
"""
form_field = forms.CharField
# Accept multiple values (e.g. MultiObjectVar)
multiple_values = False
def __init__(self, label='', description='', default=None, required=True, widget=None):
# Initialize field attributes
@ -187,6 +190,7 @@ class MultiObjectVar(ScriptVariable):
Like ObjectVar, but can represent one or more objects.
"""
form_field = DynamicModelMultipleChoiceField
multiple_values = True
def __init__(self, queryset, *args, **kwargs):
super().__init__(*args, **kwargs)