blocks: reset block errors when subwidget is prefilled (#48453)
This commit is contained in:
parent
eb60d7b514
commit
1db7d01f40
|
@ -412,6 +412,7 @@ def test_block_string_prefill(pub, blocks_feature):
|
|||
resp = app.get(formdef.get_url())
|
||||
resp.form['f1'] = 'Hello'
|
||||
resp = resp.form.submit('submit') # -> 2nd page
|
||||
assert not resp.pyquery('#form_error_f3') # not marked as error
|
||||
assert resp.form['f3$element0$f123'].value == 'Hello World'
|
||||
resp = resp.form.submit('submit') # -> validation page
|
||||
resp = resp.form.submit('submit') # -> end page
|
||||
|
|
|
@ -284,6 +284,11 @@ class BlockWidget(WidgetList):
|
|||
# database in JSON.
|
||||
self.value['schema'] = {x.id: x.key for x in self.block.fields}
|
||||
|
||||
def unparse(self):
|
||||
self._parsed = False
|
||||
for widget in self.widgets:
|
||||
widget._parsed = False
|
||||
|
||||
def parse(self, request=None):
|
||||
if not self._parsed:
|
||||
self._parsed = True
|
||||
|
|
|
@ -384,15 +384,25 @@ class FormPage(Directory, FormTemplateMixin):
|
|||
v = field.convert_value_to_str(v)
|
||||
widget.set_value(v)
|
||||
widget.transfer_form_value(req)
|
||||
|
||||
if block:
|
||||
# reset parent block if subwidget has changed; this
|
||||
# prevents "required field" to be displayed on fields that
|
||||
# have just been prefilled.
|
||||
form.get_widget('f%s' % block.id).unparse()
|
||||
form.get_widget('f%s' % block.id).clear_error()
|
||||
|
||||
if field.type == 'item' and v and widget.value != v:
|
||||
# mark field as invalid if the value was not accepted
|
||||
# (this is required by quixote>=3 as the value would
|
||||
# not be evaluated in the initial GET request of the
|
||||
# page).
|
||||
widget.set_error(get_selection_error_text())
|
||||
|
||||
if locked:
|
||||
widget.readonly = 'readonly'
|
||||
widget.attrs['readonly'] = 'readonly'
|
||||
|
||||
had_prefill = True
|
||||
return had_prefill
|
||||
|
||||
|
|
Loading…
Reference in New Issue