transfer form value

This commit is contained in:
Frédéric Péters 2020-06-10 08:41:24 +02:00
parent e9de9d11d5
commit d1a2bb1e92
4 changed files with 23 additions and 5 deletions

View File

@ -1253,11 +1253,11 @@ def test_form_titles(pub):
resp.form['f1'] = 'foo'
resp = resp.form.submit('submit')
assert '<h3 data-field-id="6">title of second page</h3>' in resp.text
resp.form['f3'] = 'foo'
resp = resp.form.submit('submit') # -> validation page
assert '<h3>1st page</h3>' in resp.text
assert '<h4 data-field-id="5">subtitle of 1st page</h4>' in resp.text
assert '<h3 data-field-id="6">title of second page</h3>' in resp.text
resp.form['f3'] = 'foo'
resp = resp.form.submit('submit').follow() # -> submit
assert '<h3>1st page</h3>' in resp.text
assert not '<div class="title "><h3>1st page</h3></div>' in resp.text

View File

@ -541,6 +541,7 @@ class WidgetField(Field):
form.add(self.widget_class, self.field_key, title = self.label,
value = value, readonly = 'readonly', **kwargs)
widget = form.get_widget(self.field_key)
widget.transfer_form_value(get_request())
if self.extra_css_class:
if hasattr(widget, 'extra_css_class') and widget.extra_css_class:
widget.extra_css_class = '%s %s' % (widget.extra_css_class, self.extra_css_class)

View File

@ -386,6 +386,7 @@ class FormPage(Directory, FormTemplateMixin):
if not isinstance(v, str) and field.convert_value_to_str:
v = field.convert_value_to_str(v)
form.get_widget('f%s' % k).set_value(v)
form.get_widget('f%s' % k).transfer_form_value(req)
if field.type == 'item' and v and form.get_widget('f%s' % k).value != v:
# mark field as invalid if the value was not accepted
# (this is required by quixote>=3 as the value would
@ -395,10 +396,6 @@ class FormPage(Directory, FormTemplateMixin):
if locked:
form.get_widget('f%s' % k).readonly = 'readonly'
form.get_widget('f%s' % k).attrs['readonly'] = 'readonly'
if field.key == 'map':
req.form['f%s$latlng' % k] = v
else:
req.form['f%s' % k] = v
had_prefill = True
if had_prefill:

View File

@ -309,6 +309,15 @@ def get_selection_error_text(*args):
SelectWidget.SELECTION_ERROR = property(get_selection_error_text)
def transfer_form_value(self, request):
# transfer form value (set in constructor, or using set_value) to
# request.form{}
request.form[self.name] = self.value
Widget.transfer_form_value = transfer_form_value
class Form(QuixoteForm):
TOKEN_NOTICE = N_(
"The form you have submitted is invalid. Most "
@ -487,6 +496,9 @@ class HtmlWidget(object):
def clear_error(self, request=None):
pass
def transfer_form_value(self, request):
pass
class CommentWidget(Widget):
template_name = 'qommon/forms/widgets/comment.html'
@ -509,6 +521,10 @@ class CommentWidget(Widget):
class CompositeWidget(quixote.form.CompositeWidget):
content_extra_attributes = {'role': 'group'}
def transfer_form_value(self, request):
for widget in self.get_widgets():
widget.transfer_form_value(request)
def render_as_thead(self):
r = TemplateIO(html=True)
r += htmltext('<tr>\n')
@ -1433,6 +1449,10 @@ class WidgetList(quixote.form.widget.WidgetList):
def add_media(self):
get_response().add_javascript(['jquery.js', 'widget_list.js'])
def transfer_form_value(self, request):
for widget in self.get_widgets():
widget.transfer_form_value(request)
def render(self):
return render(self)