fields: use lazy evaluation to compute prefill value from template (#51301)
This commit is contained in:
parent
a8d01e3da7
commit
cf1dcc0749
|
@ -1325,3 +1325,45 @@ def test_block_with_dynamic_item_field(mock_urlopen, pub, blocks_feature):
|
|||
resp = resp.form.submit()
|
||||
# second field value is kept
|
||||
assert resp.form['f2'].value == '1'
|
||||
|
||||
|
||||
def test_block_used_in_later_prefill(pub, blocks_feature):
|
||||
FormDef.wipe()
|
||||
BlockDef.wipe()
|
||||
|
||||
block = BlockDef()
|
||||
block.name = 'foobar'
|
||||
block.fields = [
|
||||
fields.StringField(id='123', required=True, label='Amount', type='string', varname='amount'),
|
||||
]
|
||||
block.store()
|
||||
|
||||
formdef = FormDef()
|
||||
formdef.name = 'form title'
|
||||
formdef.fields = [
|
||||
fields.PageField(id='0', label='1st page', type='page'),
|
||||
fields.BlockField(
|
||||
id='1', label='test', type='block:foobar', varname='data', max_items=3, hint='hintblock'
|
||||
),
|
||||
fields.PageField(id='2', label='2nd page', type='page'),
|
||||
fields.StringField(
|
||||
id='3', label='sum', prefill={'type': 'string', 'value': '{{form_var_data|getlist:"amount"|sum}}'}
|
||||
),
|
||||
]
|
||||
formdef.store()
|
||||
|
||||
app = get_app(pub)
|
||||
resp = app.get(formdef.get_url())
|
||||
resp.form['f1$element0$f123'] = '5'
|
||||
resp = resp.form.submit('f1$add_element')
|
||||
resp.form['f1$element1$f123'] = '3'
|
||||
resp = resp.form.submit('f1$add_element')
|
||||
resp.form['f1$element2$f123'] = '2'
|
||||
|
||||
resp = resp.form.submit('submit') # -> 2nd page
|
||||
assert resp.form['f3'].value == '10'
|
||||
|
||||
resp = resp.form.submit('previous') # -> 1st page
|
||||
resp.form['f1$element2$f123'] = '1'
|
||||
resp = resp.form.submit('submit') # -> 2nd page
|
||||
assert resp.form['f3'].value == '9'
|
||||
|
|
|
@ -421,7 +421,7 @@ class Field(object):
|
|||
if not Template.is_template_string(value):
|
||||
return (value, explicit_lock)
|
||||
|
||||
context = get_publisher().substitutions.get_context_variables()
|
||||
context = get_publisher().substitutions.get_context_variables(mode='lazy')
|
||||
try:
|
||||
return (Template(value, autoescape=False, raises=True).render(context), explicit_lock)
|
||||
except TemplateError:
|
||||
|
|
Loading…
Reference in New Issue