Index: CHANGES.txt =================================================================== --- CHANGES.txt (revision 121429) +++ CHANGES.txt (working copy) @@ -5,6 +5,9 @@ 2.4.3 (unreleased) ------------------ +- Ensure at least min_length widgets are rendered for a MultiWidget in input + mode. + - Added base of Czech translation. - Added Portuguese Brazilian translation. Index: src/z3c/form/widget.txt =================================================================== --- src/z3c/form/widget.txt (revision 121431) +++ src/z3c/form/widget.txt (working copy) @@ -642,6 +642,12 @@ >>> request = TestRequest() >>> multiWidget = widget.FieldWidget(multiField, widget.MultiWidget(request)) +Lets ensure that the minimum number of widgets are created. + + >>> multiWidget.update() + >>> len(multiWidget.widgets) + 2 + Now, let's check if the function will do the right thing depending on the value: Index: src/z3c/form/widget.py =================================================================== --- src/z3c/form/widget.py (revision 121429) +++ src/z3c/form/widget.py (working copy) @@ -248,6 +248,7 @@ widgets = None _value = None + _widgets_updated = False _mode = FieldProperty(interfaces.IWidget['mode']) @@ -344,6 +345,11 @@ """Setup internal widgets based on the value_type for each value item. """ oldLen = len(self.widgets) + # Ensure at least min_length widgets are shown + if (zope.schema.interfaces.IMinMaxLen.providedBy(self.field) and + self.mode == interfaces.INPUT_MODE and self.allowAdding and + oldLen < self.field.min_length): + oldLen = self.field.min_length self.widgets = [] idx = 0 if self.value: @@ -359,6 +365,7 @@ widget = self.getWidget(idx) self.widgets.append(widget) idx += 1 + self._widgets_updated = True def updateAllowAddRemove(self): """Update the allowAdding/allowRemoving attributes @@ -383,6 +390,13 @@ self.updateWidgets() return property(get, set) + def update(self): + """See z3c.form.interfaces.IWidget.""" + # Ensure that updateWidgets is called. + super(MultiWidget, self).update() + if not self._widgets_updated: + self.updateWidgets() + def extract(self, default=interfaces.NO_VALUE): # This method is responsible to get the widgets value based on the # request and nothing else.