Wel...
I solved my problem using a custom widget. I don't know if it is the best
solution, but it works.
The records are now represented like below :
*<root>
fruits
banana
apple
vegetables
potatoes
tomatoes*
Below my code for those who are interested :
*Create a "_widgets.py" file in models folder : *
class HierarchicalSelect(object):
def __init__(self, db, title_field):
self.options=[]
self.db = db
self.tablename = None
self.fieldname = None
self.title = title_field
self.type = None
self.parent=None
self.rows=None
def _childs_list(self, field, depth):
path = XML(" ")*depth
self.options.append((field['id'], path+field[self.title]))
[self._childs_list(child, (depth+1)) for child in self.rows.find(
lambda row: row.parent == field.id)]
def widget(self, field, value):
print str(field)
self.tablename = field._table
self.fieldname = field.name
self.type = field.type
self.rows = self.db(self.tablename).select()
self.parent = field
root_fields = self.db(self.parent==None).select()
[self._childs_list(field,0) for field in self.rows.find(lambda row:row
.parent == None)]
opt=[OPTION(name, _value=key) for key,name in self.options]
sel = SELECT(opt,_id="%s_%s" % (self.tablename, self.fieldname),
_class=self.type,
_name=self.fieldname,
value=value)
return sel
*In your model file . *
foodSelector = HierarchicalSelect(db,db.food.name)
db.food.parent.widget = foodSelector .widget
Le mardi 23 avril 2013 10:59:10 UTC+2, Loïc a écrit :
>
> Hi All
>
> I have a model file :
>
> db.define_table('food',
> Field('parent', 'reference food', label=T('Parent')),
> Field('name', unique=True, notnull=True, label=T('Name')),
> format='%(name)s'
> )
>
> Let's imagine I have some records in my db (fruits, vegetables, ...)
>
> In my controller, I create a form with
> form = crud.update(db.food,food,next=URL('default','index'))
>
> On my view, the "parent" field of the form is rendered as a "select" field
> containing for example :
> *fruits
> tomatoes
> banana
> apple
> potatoes
> vegetables*
>
> But I would like to see something like :
> *<root>
> |
> |___fruits
> | |___banana
> | |___apple
> |___vegetables
> |___potatoes
> |___tomatoes*
>
> I thought I could change the representation of my field using the
> "represent" attribute
> db.food.parent.represent = lambda v: ...
> But the representation of the field doesn't change in the form.
>
> I wonder if I'm in the right direction, or if there an other way to do
> what I'm trying...?
>
> Thank you
>
--
---
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.