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, brac...@gmail.com 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, brac...@gmail.com 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 web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to