hi, 

the solution to get the nested fields applied correctly lies in the template::

    <input type="hidden" name="__start__" value="${field.name}:mapping"/>
    <div tal:repeat="tup subfields">
        <div tal:replace="structure rndr(tup[1].widget.template, field=tup[1], 
cstruct=tup[0],
                      parent=field)"/>
    </div>

    <input type="text"
           name="${item_field.name}"
           value="${cstruct['location_search']}"
           tal:attributes="size field.widget.size;
                           class field.widget.css_class"
           id="${item_field.oid}" />
    <input type="hidden" name="__end__" value="${field.name}:mapping"/>

cheers, andi

On 17.06.2012, at 00:44, Andi Balke wrote:

> hi, 
> 
> i sat on this problem for 10 hours now and i have no idea anymore. if anyone 
> could give me  a hint, i would really appreciate that. 
> 
> story: i created a schema for a custom widget, wich renders, the form works, 
> all fine so far. 
> 
> problem: i need to create a nested schema so i can access ``children`` in my 
> custom widget to transmit more than only one filed. i had different 
> variations of schemas so far, which all kinda work - e.g. render - but on 
> validation my problem is i cannot access the POST data of the children in my 
> parent-schema.
> now i just wanted to see if i can access them at least in a custom validator 
> (http://deformdemo.repoze.org/interfield/), nope. also the preparer just 
> doesn't work on the parent-schema. 
> 
> here is all relevant code, maybe someone spots an error. 
> 
> thanks, andi
> 
> class curry(object):
>     """
>     class to curry a methods together with fewer arguments.
> 
>     @see: 
> http://code.activestate.com/recipes/52549-curry-associating-parameters-with-a-function/
>     """
>     def __init__(self, fun, *args, **kwargs):
>         self.fun = fun
>         self.pending = args[:]
>         self.kwargs = kwargs.copy()
> 
>     def __call__(self, *args, **kwargs):
>         if kwargs and self.kwargs:
>             kw = self.kwargs.copy()
>             kw.update(kwargs)
>         else:
>             kw = kwargs or self.kwargs
> 
>         return self.fun(*(self.pending + args), **kw)
> 
> 
> @colander.deferred
> def create_LocationPickerWidget(node, kw):
>     """
>     callable to create the widget with a deferred paramater, here
>     "request"
> 
>     gets applied by ``colander.Schema.bind(request=self.request)``
>     """
>     request = kw["request"]
>     return LocationPickerWidget(request)
> 
> class Location(colander.MappingSchema):
>     location_search = colander.SchemaNode(
>         colander.String(),
>         name = "location_string.location_search",
>         validator=colander.Length(min=1),
>     )
>     location_point = colander.SchemaNode(
>         colander.String(),
>         name = "location_string.location_point",
>         widget = deform.widget.HiddenWidget(),
>         validator=colander.Length(min=1),
>     )
> 
> 
> class LocationPicker(colander.MappingSchema):
>     """
>     schema only for a step in the form to choose a location
> 
>     @see 
> http://docs.pylonsproject.org/projects/colander/en/latest/manipulation.html
>     """
>     location_string = Location(
>         widget=create_LocationPickerWidget,
>     )
> 
>     @classmethod
>     def prepare_location(cls, fieldname, value):
>         """
>         deform preparer to convert a form submitted location in a real
>         location.
> 
>         appended below
>         """
>         if log.isEnabledFor(logging.WARN):
>             _out = StringIO()
>             pprint(value, stream=_out)
>             log.warn("%s.%s @%s value: %s", __name__, cls.__name__, 
> fieldname, _out.getvalue())
> 
>         if value:
>             lat, lng = value.split(',')
>             position = WKTSpatialElement('POINT({0} {1})'.format(lat, lng))
>             return position
>         return value
> 
> # adding a preparer to the mapping node will not work
> LocationPicker.location_string.preparer =\
>         curry(LocationPicker.prepare_location, "XX_location_string_XX")
> # those work
> Location.location_search.preparer =\
>         curry(LocationPicker.prepare_location, "location_search")
> Location.location_point.preparer =\
>         curry(LocationPicker.prepare_location, "location_point")
> 

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en.

Reply via email to