Oh! Okay... I overlooked that change in the pastebin before. My apologies. After updating the appstruct to use the 'set()' function, all is well!
This is what I do in my Product table class to set them: appstruct['categories'] = set([str(c.id) for c in self.categories]) I then end up with 'categories': set(['5']) in my appstruct and that sets the 'selected' attributes properly in the resulting HTML. Thanks! I'm glad it was something easy. On Wednesday, August 20, 2014 9:42:26 AM UTC-6, replaceafill wrote: > > Your appstruct needs the same type of object your SchemaNode defines > containing just the "keys". For example if you want to set keys 1 and 3 > as selected when the appstruct is rendered, pass: > > 'categories': set(['1', '3']) > > Again, tested against the demo [0] > > HTH. > > [0] http://pastebin.com/8HpeEEvM > > El 20/08/14 a las 09:12, Derek Hildreth escibió: > > Thank you, that seems like the sort of small thing I'd be missing, but > > it /still/ didn't work? > > > > Recap: > > > > def get_category_choices(): > > all_categories = DBSession.query(Category).all() > > return [(str(c.id <http://c.id/>), c.name <http://c.name/>) for > > c in all_categories] > > > > categories = get_category_choices() > > > > class ProductForm(colander.Schema): > > > > categories = colander.SchemaNode( > > colander.Set(), > > widget=deform.widget.SelectWidget( > > > > values=categories, > > multiple=True, > > > > ), > > > > default='3', > > > > validator=colander.Length(min=1), > > ) > > > > > > My appstruct looks like: > > > > 'categories': [{'id': '3', 'name': 'Category 3'}] > > > > > > The HTML generated does not contain selected attribute: > > > > <select name="categories" id="deformField4" multiple="multiple"> > > <option value="1">Category 1</option> > > <option value="2">Category 2</option> > > <option value="3">Category 3</option> > > </select> > > > > > > Mariano mentions setting it at render time... I suppose, but the deform > > demo here > > < > http://deformdemo.repoze.org/sequence_of_defaulted_selects_with_initial_item/> > > clearly > > demonstrates the ability to set defaults within the SchemaNode (which I > > was doing wrong before; thanks @replaceafill). > > > > On Wednesday, August 20, 2014 8:55:05 AM UTC-6, replaceafill wrote: > > > > I think you have just set the default parameter incorrectly. It > should > > go on the SchemaNode [0]. You have set it on the SelectWidget [1]. > > > > I tested it with the current deformdemo branch [2] and it seems to > work > > as you expect. > > > > HTH. > > > > [0] > > > http://docs.pylonsproject.org/projects/colander/en/latest/api.html#schema-related > > > < > http://docs.pylonsproject.org/projects/colander/en/latest/api.html#schema-related> > > > > > > [1] > > > http://deform.readthedocs.org/en/latest/api.html#module-deform.widget < > http://deform.readthedocs.org/en/latest/api.html#module-deform.widget> > > > > [2] http://pastebin.com/EHcukwcT > > > > El 20/08/14 a las 08:35, Derek Hildreth escibió: > > > Thanks so much for the response. Unfortunately, it didn't add the > > > 'selected' attribute to the select option. > > > > > > I tried the following as well, since you had a good point about > value > > > types and making sure they were strings... > > > > > > return [(c <http://c.id/>.name, c.name <http://c.name> > > <http://c.name/>) for c in > > > all_categories] > > > > > > > > > And then, > > > > > > categories = colander.SchemaNode( > > > colander.Set(), > > > widget=deform.widget.SelectWidget( > > > > > > values=categories, > > > multiple=True, > > > > > > default='Category 3', > > > > > > ), > > > validator=colander.Length(min=1), > > > ) > > > > > > > > > I then made sure to update the appstruct similarly with str() so > > that I > > > end up with this in it: > > > > > > 'categories': [{'id': '3', 'name': 'Category 3'}] > > > > > > > > > This didn't add the 'selected' attribute for the select option > > either. > > > > > > Strange, right? > > > > > > On Wednesday, August 20, 2014 2:08:24 AM UTC-6, Rebelo wrote: > > > > > > > > > try replacing: > > > return [(c.id <http://c.id> <http://c.id>, c.name > > <http://c.name> <http://c.name>) for c in > > > all_categories] > > > with > > > > > > return [(str(c.id <http://c.id>) <http://c.id>, c.name > > <http://c.name> <http://c.name>) for c in > > > all_categories] > > > > > > > > > > > > On Wednesday, August 20, 2014 6:32:16 AM UTC+2, Derek Hildreth > > wrote: > > > > > > I have a schema defined as: > > > > > > def get_category_choices(): > > > all_categories = DBSession.query(Category).all() > > > return [(c.id <http://c.id> <http://c.id>, c.name > > <http://c.name> <http://c.name>) for > > > c in all_categories] > > > > > > categories = get_category_choices() > > > > > > class ProductForm(colander.Schema): > > > > > > name = colander.SchemaNode(colander.String(), > title = > > > "Name", > > > > > > validator=colander.Length(max=80), > > > ) > > > > > > description = > colander.SchemaNode(colander.String(), > > > title="Description", > > > > > > validator=colander.Length(max=2000), > > > > > > widget=deform.widget.TextAreaWidget(rows=10, cols=60), > > > ) > > > > > > categories = colander.SchemaNode( > > > colander.Set(), > > > widget=deform.widget.SelectWidget( > > > > > > values=categories, > > > multiple=True, > > > > > > ), > > > validator=colander.Length(min=1), > > > ) > > > > > > > > > Here's the code I'm using in Pyramid views.py: > > > > > > myform = Form(ProductForm(), buttons=('submit',)) > > > form = myform.render(product.appstruct()) > > > return {'form': form} > > > > > > > > > My appstruct looks like this: > > > > > > {'description': 'Product description goes here ', > > > 'categories': [{'id': 1L, 'name': 'Category 1'}, > > {'id':3L, > > > 'name':'Category 2'}], 'id': 1L, 'name': 'Product name > > goes > > > here'} > > > > > > > > > I'd like the form to be rendered with a multiple select > > box that > > > has 'Category 1' and 'Category 2' selected by default, > > like so: > > > > > > <select name="categories" id="deformField4" > > multiple="multiple"> > > > <option value="1" selected="selected">Category > > 1</option> > > > <option value="2">Category 2</option> > > > <option value="3" selected="selected">Category > > 3</option> > > > </select> > > > > > > > > > I can't seem to get this to happen. I have tried to use > > > 'default' (as shown deform demo here > > > > > < > http://deformdemo.repoze.org/sequence_of_defaulted_selects_with_initial_item/ > > < > http://deformdemo.repoze.org/sequence_of_defaulted_selects_with_initial_item/>>) > > > > > > > to get at least /one/ item to select (for a test), and it > > > doesn't seem to do it either. In other words, this: > > > > > > categories = colander.SchemaNode( > > > colander.Set(), > > > widget=deform.widget.SelectWidget( > > > > > > values=categories, > > > multiple=True, > > > > > > default='3', > > > > > > ), > > > validator=colander.Length(min=1), > > > ) > > > > > > > > > Results in this (notice lack of 'selected' attributes): > > > > > > <select name="categories" id="deformField4" > > multiple="multiple"> > > > <option value="1">Category 1</option> > > > <option value="2">Category 2</option> > > > <option value="3">Category 3</option> > > > </select> > > > > > > > > > I must be missing something simple here. I'd really > > appreciate > > > any help. Thanks in advance. > > > > > > -- > > > You received this message because you are subscribed to the Google > > > Groups "pylons-discuss" group. > > > To unsubscribe from this group and stop receiving emails from it, > > send > > > an email to [email protected] <javascript:> > > > <mailto:[email protected] <javascript:> > <javascript:>>. > > > To post to this group, send email to [email protected] > > <javascript:> > > > <mailto:[email protected] <javascript:>>. > > > Visit this group at http://groups.google.com/group/pylons-discuss > > <http://groups.google.com/group/pylons-discuss>. > > > For more options, visit https://groups.google.com/d/optout > > <https://groups.google.com/d/optout>. > > > > -- > > You received this message because you are subscribed to the Google > > Groups "pylons-discuss" group. > > To unsubscribe from this group and stop receiving emails from it, send > > an email to [email protected] <javascript:> > > <mailto:[email protected] <javascript:>>. > > To post to this group, send email to [email protected] > <javascript:> > > <mailto:[email protected] <javascript:>>. > > Visit this group at http://groups.google.com/group/pylons-discuss. > > For more options, visit https://groups.google.com/d/optout. > > -- You received this message because you are subscribed to the Google Groups "pylons-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/pylons-discuss. For more options, visit https://groups.google.com/d/optout.
