How about doing your own widget:

import re
def natural_key(string_):
  return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]

items = db(db.item_type.id > 0).select()
sorted_items= items.sort(key=natural_key(items.name))

db.item.item_type.widget = lambda f, v: SELECT([OPTION(i.name, _value=i.id) 
for i in sorted_items], _name=f.name, _id="%s_%s" % (f._tablename, f.name), 
_value=v, value=v)

On Saturday, 11 May 2013 04:11:41 UTC, rppowell wrote:
>
> I have pre-populated a table of types by name:
>   db.item_type.insert(name='Type1'...)
>   db.item_type.insert(name='Type2'...)
>   db.item_type.insert(name='Type3'...)
>   ...
>   db.item_type.insert(name='Type10'...)
>   db.item_type.insert(name='Type11'...)
>   ...
>
> I want to use the table as selection in another table, (using 
> requires=IS_IN_DB(db, db.item_type, '%(name)s'):
>   db.define_table('item',
>     Field('item_type', db.item_type),
>   )
>   db.item.item_type.requires = IS_IN_DB(db, db.item_type, '%(name)s')
>
> When I use a form to add a new record, the items are displayed out of 
> order in the dropdown:
>   Type1
>   Type10
>   Type11
>   ...
>   Type2
>
> How do I specify using natural sorting, for example, using the following 
> python:
>
> import re
> def natural_key(string_):
>   return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', 
> string_)]
>
> items = [
>   'Item99', 'Item1', 'Item10', 'Item20', 'Item2', 'Item3', 'Item30'
> ]
> items.sort(key=natural_key)
> print ' '.join(items)
>
>
>
> How do I do this with the db in web2py?  Do a query, sort the list, and 
> use it as a IS_IN_SET()?
>
> -rppowell
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to