when you redirect you get a new request object so you could pass the data to the new request.vars with: URL(r=request, f='add_2', vars={'x':request.vars.x, 'y':request.vars.y}) or simply: URL(r=request, f='add_2', vars=request.vars)
Probably better to pass temporary data in vars than store in session. Richard On Oct 6, 5:26 am, devnull <ache...@gmail.com> wrote: > Below is the difficulty I was having getting request.vars to the > target of the redirect. [add] redirects to [add_2], and when it does, > request.vars doesn't have .x and .y ... instead I find myself stuffing > x and y into the session explicitly and then pulling them out in > [add_2] also explicitly. > > Is there something in the framework that handles this? (I feel like > I'm missing something only a newbie would miss). :-) .... maybe > [redirect] or [URL] takes another argument that I don't know about > yet... I hope I've freed you from the notion that I know what I'm > doing :-P > > def add(): > form=SQLFORM.factory( > Field('x','double', > requires=IS_FLOAT_IN_RANGE( > 0,500, > error_message='number between 0 and 500 required')), > Field('y','double', > requires=IS_FLOAT_IN_RANGE( > 0,100, > error_message='number between 0 and 100 required'))) > if form.accepts(request.vars, session): > session.x = request.vars.x > session.y = request.vars.y > redirect(URL(r=request,f='add_2')) > return dict(form=form) > > def add_2(): > x=session.x > y=session.y > sum=float(x)+float(y) > return dict(x=x,y=y,sum=sum) > > On Oct 5, 11:31 am, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > Thank you devnull, > > > some answers below: > > > On Oct 5, 10:14 am, devnull <ache...@gmail.com> wrote: > > > > Hello all. Just discovered web2py and I think it's great. I wish we > > > were using it here at work, and so do some of my co-workers. > > > > I have created a little form as an exercise for myself and I came up > > > with some questions. > > > > It's likely that some of the things I'm wondering about are handled by > > > the framework and I just don't know it yet... > > > > ... and the rest of the stuff is probably telltale stylistic noob-ness > > > that I hope you'll point out. > > > > At the bottom is the controller and view for my form. There's no model > > > yet. The form just adds two values, x and y. Here are the questions. > > > > 1. The basic structure of the form is defined in the controller part. > > > I did this so I could use the 'requires' argument to the INPUT method > > > to specify a validator. Is this ok? The reason I ask is it feels like > > > I'm putting view stuff in the controller when I say things like TABLE > > > and TR... > > > You can do > > form=SQLFORM.factory(Field('x',double')),Field('y','double'))) > > > and in view > > {{=form.custom.begin}} > > {{=form.custom.widget.x}} > > {{=form.custom.widget.y}} > > {{=form.custom.submit}} > > {{=form.custom.end}} > > then insert the HTML you need in the view. > > > > 2. I wanted a more specific error message for each field which uses an > > > is-float-in-range validator ... But is there a way to refer to the > > > actual max and min without repeating it in the string? Something like > > > $max and $min? > > > No, there is not. We could add it. If we do it would be %{minimum}s % > > (maximum)s. Pros/Cons? > > > > 3. At the end of the controller, am I making a mistake by passing x > > > and y explicitly? Are they also hiding inside form and can I extract x > > > and y from the form in the view html? > > > You are not but form.vars.x is available inside the view since you are > > passing the form. > > > > 4. Would it be a better practice to redirect the user to another page > > > for the result instead of doing everything on the same page? I tried > > > this but had some difficulty getting x and y in the second page for > > > processing (adding). > > > I like to redirect on accept. In this case there is no different but > > you may have multiple objects in one page that depend on one another. > > Without an explicit redirection it ma be difficult to keep track of > > their state. > > > > 5. Do you have any other advice? > > > No. It seems to me you know aht you are doing. > > > > Looking forward to learning from you all. Thanks in advance! > > > > controller: > > > > def form_example(): > > > form=FORM(TABLE( > > > TR('x', > > > INPUT(_type='text',_name='x', > > > requires=IS_FLOAT_IN_RANGE( > > > 0,500, > > > error_message='number between 0 and 500 > > > required'))), > > > TR('y', > > > INPUT(_type='text',_name='y', > > > requires=IS_FLOAT_IN_RANGE( > > > 0,100, > > > error_message='number between 0 and 100 > > > required'))), > > > TR('',INPUT(_type='submit', > > > _value='add')))) > > > sum = x = y = '' > > > visibility = 'hidden' > > > if form.accepts(request.vars, session): > > > sum = float(request.vars.x) + float(request.vars.y) > > > visibility = 'visible' > > > return dict(form = form, > > > sum = sum, > > > x = request.vars.x, > > > y = request.vars.y, > > > visibility = visibility) > > > > view: > > > > <h1>form example</h1> > > > {{=form}} > > > <table style="visibility:{{=visibility}}"> > > > <tr> > > > <td>Most recent x entered</td> > > > <td>{{=x}}</td> > > > </tr> > > > <tr> > > > <td>Most recent y entered</td> > > > <td>{{=y}}</td> > > > </tr> > > > <tr> > > > <td>sum</td> > > > <td>{{=sum}}</td> > > > </tr> > > > </table> > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py-users" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---