There is an easier way to achieve this by using Deferred :
from tw2.core import Deferred
class Add_form(AddRecordForm):
__model__ = Bills
proposer_id = twf.SingleSelectField(
options=Deferred(get_proposer_id_options))
It should work as expected and it probably easier than relying on prepare.
Deferred parameters are documented at
http://tw2core.readthedocs.org/en/latest/history/#explicitly-deferred-parameters
On Mon, Mar 10, 2014 at 8:49 PM, puska <[email protected]> wrote:
> Thanks Moritz, helped by your suggestion I managed to make it work.
> I ended up doing it the following way:
>
> def get_options(table, id_field):
> return [(getattr(rec, id_field), rec.__unicode__()) for rec in
> DBSession.query(table).all()]
>
> class Proposer_id(twf.SingleSelectField):
> def prepare(self):
> self.options = get_options(Proposers_select_view, 'id')
> super(Proposer_id, self).prepare()
>
> class BillController(CrudRestController):
> ...
> class Add_form(AddRecordForm):
> proposer_id = Proposer_id('proposer_id', label='Predlagatelji: ',
> options=[], size=8, validator=twc.Required)
>
> I alsao tried to make it more general by overriding __init__ method of
> SingleSelectField widget (sending extra parameters to my __init__ and than
> calling SingleSelectField __init__ method but could not make it work).
>
>
>
>
> On Friday, February 7, 2014 12:37:42 PM UTC+1, puska wrote:
>
>> Hi everyone,
>>
>> I've been trying to create a form using CrudRestController which is
>> having TW2 SingleSelectField as a field of a column with foreign key on it.
>> I tried several approaches to get SingleSelectField to update it's options
>> per request, but my approaches do not work. My code looks like:
>>
>> from tgext.crud import CrudRestController
>> from tgext.crud.utils import SortableTableBase
>> import tw2.forms as twf
>>
>> def get_proposer_id_options():
>> return [(rec.id, rec.name) for rec in DBSession.query(Proposers_
>> select_view).all()]
>>
>> class BillController(CrudRestController):
>> class Table(SortableTableBase):
>> __model__ = Bills_view
>>
>> class Table_filler(TableFiller):
>> __model__ = Bills_view
>>
>> @expose('genshi:amandmani.templates.crud_new', inherit=True)
>> def new(self, *args, **kw):
>> params = super(BillController, self).new(*args, **kw)
>> params['value'] = dict(term_id=DBSession.query(
>> Max_term_id_view).one().max_term_id,
>> name=DBSession.query(Max_bill_
>> view).one().max_bill+1)
>>
>> class Add_form(AddRecordForm):
>> __model__ = Bills
>> proposer_id = twf.SingleSelectField('proposer_id',
>> label='Predlagatelj: ', options=get_proposer_id_options())
>>
>> table = Table(DBSession)
>> table_filler = Table_filler(DBSession)
>> new_form = Add_form(DBSession)
>>
>> When I add a proposer into a database and refresh the "new" page
>> proposer_id SingleSelectField does not get updated.
>> i also tried to use DbSingleSelectField from tw2.sqla but then I have
>> problems with setting initial values for the field (it needs to be an
>> instance of Porposers, not an id value) and validating values (
>> DbSingleSelectField returns an instance of Porposers, not an id).
>>
>> I also noticed that it works out in admin but could not figure out how is
>> it accomplished there.
>>
>> Based on the activity of Turbogears group it looks like that either no
>> one is having that kind of a problem from 2011 (when TW2 was still
>> unavailable), so most probably I am doing something wrong.
>> Any help would be greatly appreciated.
>>
>> Puska
>>
> --
> You received this message because you are subscribed to the Google Groups
> "TurboGears" 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/turbogears.
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"TurboGears" 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/turbogears.
For more options, visit https://groups.google.com/d/optout.