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 []
 | 
