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