37 lines
1.2 KiB
Python
37 lines
1.2 KiB
Python
|
"""Dynamic array widget"""
|
||
|
from django import forms
|
||
|
|
||
|
|
||
|
class DynamicArrayWidget(forms.TextInput):
|
||
|
"""Dynamic array widget"""
|
||
|
|
||
|
template_name = "lib/arrayfield.html"
|
||
|
|
||
|
def get_context(self, name, value, attrs):
|
||
|
value = value or [""]
|
||
|
context = super().get_context(name, value, attrs)
|
||
|
final_attrs = context["widget"]["attrs"]
|
||
|
id_ = context["widget"]["attrs"].get("id")
|
||
|
|
||
|
subwidgets = []
|
||
|
for index, item in enumerate(context["widget"]["value"]):
|
||
|
widget_attrs = final_attrs.copy()
|
||
|
if id_:
|
||
|
widget_attrs["id"] = "{id_}_{index}".format(id_=id_, index=index)
|
||
|
widget = forms.TextInput()
|
||
|
widget.is_required = self.is_required
|
||
|
subwidgets.append(widget.get_context(name, item, widget_attrs)["widget"])
|
||
|
|
||
|
context["widget"]["subwidgets"] = subwidgets
|
||
|
return context
|
||
|
|
||
|
def value_from_datadict(self, data, files, name):
|
||
|
try:
|
||
|
getter = data.getlist
|
||
|
return [value for value in getter(name) if value]
|
||
|
except AttributeError:
|
||
|
return data.get(name)
|
||
|
|
||
|
def format_value(self, value):
|
||
|
return value or []
|