Thanks, however I just noticed in the original code that I had incorrectly
written the callback function as "myButton()". It should have been
"myCallback()". I modified the code:
def search_results():
div = DIV(.....)
response.view = 'default/search_results.html'
return dict(div=div)
def myCallback():
someId = request.args(0)
resultSet = db(....)
return search_results(resultSet)
Sorry about the confusion. This way works, but after clicking the button,
it displays the resultSet on a page with the URL "default/myCallback/1". I
wanted it to be something like "default/search_results/1".
But web2py follows this pattern to URLs:
/[application]/[controller]/f
So 'f' would be the "myCallback" since it's the function that was called
when you clicked on the button. I thought a redirect would fix it since I
would be directing the controller function to search_results, and then the
URL would be correct. What I couldn't figure out was how to pass data from
the callback function to the redirected function.
Is there a way to fix this using what you suggested or is there a better
way to do this (given the fixed code)?
On Thursday, May 23, 2013 6:22:52 PM UTC-4, Anthony wrote:
>
> But presumably the myButton() function does not have its own view given
> that it was originally written to always redirect to another URL. In that
> case, why not just make the myButton.html view render the search results as
> desired? If you want a search_results.html view to be used from multiple
> functions, that's no problem either -- here are three options:
>
> def search_results(resultSet):
> div = DIV(.....)
> response.view = 'default/search_results.html'
> return dict(div=div)
>
> So, any time the search_results() function is called by another function,
> it sets the view to search_results.html. Or, you can set the view within
> the calling function:
>
> def myButton():
> someId = request.args(0)
> resultSet = db(....)
> response.view = 'default/search_results.html'
> return search_results(resultSet)
>
> Or you could include the search_results view in another view. For example,
> in myButton.html, you can do:
>
> {{extend 'layout.html'}}
> {{include 'default/search_results.html'}}
>
> Anthony
>
>
> On Thursday, May 23, 2013 4:02:29 PM UTC-4, [email protected] wrote:
>>
>> search_results() will have to be exposed since I want to display the
>> results on a different page (in search_results.html). I think returning the
>> div using your suggestion would still be on the same page?
>>
>>
>>
>> On Thursday, May 23, 2013 3:38:17 PM UTC-4, Anthony wrote:
>>>
>>> Why do you need to redirect at all? You can just call the
>>> search_results() function directly from the myButton() function:
>>>
>>> def search_results(resultSet):
>>> div = DIV(.....)
>>> return dict(div=div)
>>>
>>> def myButton():
>>> someId = request.args(0)
>>> resultSet = db(....)
>>> return search_results(resultSet)
>>>
>>> If the search_results() function is needed in other controllers, you
>>> could define it in a model file or in a module and import it. Note,
>>> functions that take arguments (as search_results does above) are not
>>> exposed as actions accessible via URL -- they are for internal use only
>>> (same for a function that begins with a double underscore, even if it
>>> doesn't take any arguments).
>>>
>>> Anthony
>>>
>>> On Thursday, May 23, 2013 2:51:24 PM UTC-4, [email protected] wrote:
>>>>
>>>> In my views, I have:
>>>>
>>>> {{=A('click for more information', _href=URL("myCallback", args=[1]))}}
>>>>
>>>>
>>>> When the anchor button is clicked, my callback will do some lookup and
>>>> processing in the db, and then will redirect to a new page populated with
>>>> the new information:
>>>>
>>>> def search_results():
>>>> resultSet = request.args(0)
>>>> # Build HTML helpers using resultSet
>>>> div = DIV(.....)
>>>>
>>>> return dict(div=div)
>>>>
>>>> def myButton():
>>>> # Figure out the id from the request
>>>> someId = request.args(0)
>>>>
>>>> # get some data from db using the id
>>>> resultSet = db(....)
>>>>
>>>>
>>>> # want to redirect to another page with the new data in the
>>>> resultSet
>>>> redirect(URL('search_results', args=resultSet))
>>>>
>>>> But doing the redirect with the resultSet args will screw up the URL
>>>> and I'll end up with an invalid request.
>>>>
>>>> I've thought of two ways around this:
>>>>
>>>> 1) Create a temporary session variable and store the resultSet there.
>>>> Once I'm done with the data, I'll explicitly clear it.
>>>>
>>>> 2) Instead of doing the database logic in the callback, pass the id to
>>>> the search_results() and do the database logic there.
>>>>
>>>> I'm hesitant to adopt the first option because it seems messy to create
>>>> a bunch of session variables for temporary things (unless this is standard
>>>> practice?).
>>>>
>>>> The second option seems okay, but I'm afraid that the code will become
>>>> too specific to that particular anchor tag. That is, if I create a new
>>>> anchor tag to do some other search, the database logic may be different
>>>> than the one inside the search_results(). For this, I guess the better
>>>> question should be if the database logic code should live in the callback
>>>> function or in the target redirect controller function?
>>>>
>>>>
>>>> In spite of this, what would be the clean or proper way of sending data
>>>> with a redirect from a callback function?
>>>>
>>>
--
---
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.