I have discovered where my problem came from.

If you try this model :

db.define_table('message',
    Field('title'),
    Field('tosomeone', 'list:reference auth_user'))

and this controller :

@auth.requires_login()
def write_message():
    form = SQLFORM(db.message)
    if form.accepts(request.vars, session):
        response.flash = 'Got it'
    return dict(form=form)

while still using the same web2pyslice*, everything works.

* http://www.web2pyslices.com/slices/take_slice/70

Now change "form.accepts(request.vars, session)" into
"form.process().accepted" :

@auth.requires_login()
def write_message():
    form = SQLFORM(db.message)
    if form.process().accepted:
        response.flash = 'Got it'
    return dict(form=form)

then although the "title" field is filled, the "tosomeone" field is
not. The "tosomeone" field remains empty. So the problem came from
"form.process().accepted", without me noticing it at first.

By keeping "if form.accepts(request.vars, session):", I solved my
problem.

Archibald


On 29 oct, 13:20, Archibald Linx <[email protected]> wrote:
> I was wondering if the problem could come from
> "multiselect_widget(f,v)", a function that I took from this Web2py
> slices page :http://www.web2pyslices.com/slices/take_slice/70
>
> In this function you can find the following line : "inp =
> SQLFORM.widgets.options.widget(f,v)"
>
> But now I am using "SQLFORM.factory", not exclusively "SQLFORM". Could
> the problem lie there ?
>
> Thanks for your help,
> Archibald
>
> On 28 oct, 19:18, Archibald Linx <[email protected]> wrote:
>
>
>
>
>
>
>
> > Thank you Anthony, I have given it a thought and I will create another
> > table called "status".
>
> > The "message" table contains the fields : "id" and "to" among others.
> > The "status" table contains the fields : "id", "message_id", "person"
> > and "status" among others.
> > "to" is readable and writable.
> > "message_id", "person" and "status" are non readable and non writable
> > fields.
>
> > I think that what I need is one form for multiple tables 
> > :http://web2py.com/book/default/chapter/07#One-form-for-multiple-tables
>
> > Here are two rows of the "message" table (without all the fields) :
> > id / to
> > 1  / steve,jimmy
> > 2  / julia
>
> > Here are the corresponding rows of the "status" table (without all the
> > fields) :
> > id / message_id / person / status
> > 1  /   1        / steve  /  0
> > 2  /   1        / jimmy  /  0
> > 3  /   2        / julia  /  0
>
> > The "message_id" field in the "status" table refers to the "id" in the
> > "message" table.
>
> > Here is what I have tried in the controller :
>
> >     form = SQLFORM.factory(db.message,db.status)
> >      if form.process().accepted:
> >         id = db.message.insert(**db.message._filter_fields(form.vars))
> >         form.vars.message_id = id
> >         for to in form.vars.to:
> >             form.vars.person = to
> >             id =
> > db.status.insert(**db.status._filter_fields(form.vars))
>
> > Unfortunately the "to" field of the "message" table remains empty. And
> > an empty row is inserted in the "status" table.
>
> > Where does the problem come from ? Could there be a problem with the
> > "_filter_fields" method when it deals with a "list:reference" field ?
> > I am just giving it a go ;)
>
> > Thanks a lot,
> > Archibald
>
> > On 26 oct, 23:57, Anthony <[email protected]> wrote:
>
> > > That's what I was thinking.list: type fields are good if you just need to
> > > store alistof things associated with a given record and retrieve thelist
> > > when the record is retrieved, but they aren't necessarily easy or 
> > > efficient
> > > for querying the data (depending on the application). If you really want 
> > > to
> > > stick with thelist: fields, I suppose you could do a select to get the
> > > Julia records, and then use some Python code to further filter the records
> > > based on status. You might also be able to create either a computed or
> > > virtual field that concatenates name and status into a newlist, and query
> > > that. Depending on how many records you're dealing with, though, it might
> > > be more efficient to go with a more normalized data structure.
>
> > > Anthony
>
> > > On Wednesday, October 26, 2011 5:38:41 PM UTC-4, Archibald Linx wrote:
>
> > > > Dear Anthony,
>
> > > > I have asked the question on Stackoverflow and it seems it is a bad
> > > > database structure ;) Sorry.
>
> > > > See :http://stackoverflow.com/questions/7908024/sql-query-list-fields
>
> > > > I will put the status information somewhere else. Maybe in a separate
> > > > database. I don't know yet.
>
> > > > Thanks for the help you gave me,
> > > > Archibald
>
> > > > On 26 oct, 20:35, Archibald Linx <[email protected]> wrote:
> > > > > Thank you Anthony.
>
> > > > > I don't know about the raw SQL query. I will ask on Stackoverflow and
> > > > > post the link here.
>
> > > > > Best,
> > > > > Archibald
>
> > > > > On 26 oct, 19:07, Anthony <[email protected]> wrote:
>
> > > > > > On Wednesday, October 26, 2011 12:21:33 PM UTC-4, Archibald Linx
> > > > wrote:
>
> > > > > > > Thank you Anthony !
>
> > > > > > > Is the length "len" always defined in Python ?
>
> > > > > > No, I think the len() function will fail if you pass None to it, so 
> > > > > > if
> > > > you
> > > > > > were using request.vars, you'd want something like:
>
> > > > > > default=len(request.vars.to) if request.vars.to is not None else
> > > > [whatever
> > > > > > you want the default to be otherwise]
>
> > > > > > > I couldn't find much tools in the documentation to query lists of
> > > > > > > references apart from the "contains" operator.
>
> > > > > > > For example, let's have the following "message" table :
> > > > > > > id / to          / status
> > > > > > > 1  / steve,jimmy / 0,2
> > > > > > > 2  / john,julia  / 1,2
> > > > > > > 3  / julia,peggy / 0,1
>
> > > > > > > I want to get the rows where "Julia" is in "to" and where her 
> > > > > > > status
> > > > > > > is "0" (in this particular case, that is row n°3).
> > > > > > > With the "contains" operator I only know how to get the rows where
> > > > > > > "Julia" is in "to" (that is row n°2 and n°3).
>
> > > > > > > Should I write raw SQL ?
>
> > > > > > How would you write it in raw SQL?- Masquer le texte des messages 
> > > > > > précédents -
>
> > > - Afficher le texte des messages précédents -

Reply via email to