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), 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
>  
> [1] 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/>) 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>, c.name <http://c.name>) for c in 
> >     all_categories] 
> >     with 
> > 
> >     return [(str(c.id) <http://c.id>, 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>, 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/>)
>  
>
> >         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:>>. 
> > 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.

Reply via email to