web/form.py
branchtls-sprint
changeset 849 8591d896db7e
parent 848 f5aca5c5f6ca
child 863 4fde01fc39ca
equal deleted inserted replaced
848:f5aca5c5f6ca 849:8591d896db7e
   433         self.form_build_context(values)
   433         self.form_build_context(values)
   434         return renderer.render(self)
   434         return renderer.render(self)
   435 
   435 
   436     def form_build_context(self, values):
   436     def form_build_context(self, values):
   437         self.context = context = {}
   437         self.context = context = {}
       
   438         # on validation error, we get a dictionnary of previously submitted values
       
   439         previous_values = self.req.data.get('formvalues')
       
   440         if previous_values:
       
   441             values.update(previous_values)
   438         for field in self.fields:
   442         for field in self.fields:
   439             context[field] = {'value': self.form_field_value(field, values),
   443             context[field] = {'value': self.form_field_value(field, field_values),
   440                               'name': self.form_field_name(field, values),
   444                               'name': self.form_field_name(field),
   441                               'id': self.form_field_id(field, values),
   445                               'id': self.form_field_id(field),
   442                               }
   446                               }
   443 
   447 
   444     def form_field_value(self, field, values):
   448     def form_field_value(self, field, values):
   445         """looks for field's value in
   449         """looks for field's value in
   446         1. kw args given to render_form
   450         1. kw args given to render_form (including previously submitted form
       
   451            values if any)
   447         2. req.form
   452         2. req.form
   448         3. field's initial value
   453         3. field's initial value
   449         """
   454         """
   450         if field.name in values:
   455         if field.name in values:
   451             value = values[field.name]
   456             value = values[field.name]
   453             value = self.req.form[field.name]
   458             value = self.req.form[field.name]
   454         else:
   459         else:
   455             value = field.initial
   460             value = field.initial
   456         return field.format_value(self.req, value) 
   461         return field.format_value(self.req, value) 
   457 
   462 
   458     def form_field_name(self, field, values):
   463     def form_field_name(self, field):
   459         return field.name
   464         return field.name
   460 
   465 
   461     def form_field_id(self, field, values):
   466     def form_field_id(self, field):
   462         return field.id
   467         return field.id
   463    
   468    
   464     def form_field_vocabulary(self, field):
   469     def form_field_vocabulary(self, field):
   465         raise NotImplementedError
   470         raise NotImplementedError
   466     
   471     
   497         self.fields.append(TextField(name='eid', widget=HiddenInput))
   502         self.fields.append(TextField(name='eid', widget=HiddenInput))
   498         
   503         
   499     def form_render(self, entity, **values):
   504     def form_render(self, entity, **values):
   500         self.entity = entity
   505         self.entity = entity
   501         return super(EntityFieldsForm, self).form_render(**values)
   506         return super(EntityFieldsForm, self).form_render(**values)
   502 
   507         
   503     def form_field_value(self, field, values):
   508     def form_field_value(self, field, values):
   504         """look for field's value with the following rules:
   509         """look for field's value with the following rules:
   505         1. handle special __type and eid fields
   510         1. handle special __type and eid fields
   506         2. looks in kw args given to render_form
   511         2. looks in kw args given to render_form (including previously submitted
       
   512            form values if any)
   507         3. looks in req.form
   513         3. looks in req.form
   508         4. if entity has an eid:
   514         4. if entity has an eid:
   509              1. looks for an associated attribute / method
   515              1. looks for an associated attribute / method
   510              2. use field's initial value
   516              2. use field's initial value
   511            else:
   517            else:
   543                     value = field.initial
   549                     value = field.initial
   544             if callable(value):
   550             if callable(value):
   545                 values = value()
   551                 values = value()
   546         return field.format_value(self.req, value) 
   552         return field.format_value(self.req, value) 
   547 
   553 
   548     def form_field_name(self, field, values):
   554     def form_field_name(self, field):
   549         if field.eidparam:
   555         if field.eidparam:
   550             return eid_param(field.name, self.entity.eid)
   556             return eid_param(field.name, self.entity.eid)
   551         return field.name
   557         return field.name
   552 
   558 
   553     def form_field_id(self, field, values):
   559     def form_field_id(self, field):
   554         if field.eidparam:
   560         if field.eidparam:
   555             return eid_param(field.id, self.entity.eid)
   561             return eid_param(field.id, self.entity.eid)
   556         return field.id
   562         return field.id
   557         
   563         
   558     def form_field_vocabulary(self, field):
   564     def form_field_vocabulary(self, field):