Assuming your ajax callback function is correctly called you just need to do:
redirect(location, client_side=True) instead of redirect(location) With client_side = True you are handling the redirect client-side and not server side. This is designed to work over ajax requests. On Monday, 21 January 2013 12:58:03 UTC-6, c0nstin3 wrote: > > Hi everyone, > > > Could someone please help me with a problem I'm having with the > *amazing*web2py framework? > > > This is hard to explain, so please bear with me, I'm still new to web > development :) > > > I seem to have a problem with using redirect in a function that is > called via ajax. I thought I could use web2py_component method to call a > method that returns a form (using SQLFORM or CRUD) and when the form is > processed OK I could redirect to another method and have the content of > that method returned instead. > > > Everything is OK if I just add records, or edit records or delete > records BUT when I edit or delete a record and then try to add a record > something odd happens. Basically, when I delete a record I redirect back to > the index page (to reload the grid). The grid is rendered OK BUT when a add > a new record (using the form included in the index page) the WRONG METHOD > is called. I can see from the debug that the delete method is called. I > presume its all to do with me doing a redirect from within a .load file > that has been rendered via web2py_component. > > > I have page that I load a tabbed display into using ajax > (web2py_component). The tabs are labelled Contacts, Documents, Widgets etc. > When I click on the Contacts tab I use ajax to call contacts/index and > display the what is returned into the tab-content div. Everything is OK at > this point. > > > @auth.requires_login() > > def index(): > > company_id = request.args[0] > > crud.settings.hideerror=True > > > db.contact.company.default = company_id > > > grid = create_grid(db.contact.company == company_id, company_id) > > form = crud.create(db.contact, next=URL('contacts', 'index', > args=company_id, user_signature=True)) > > submit_btn = form.element(_type='submit') > > submit_btn['_class']='btn btn-small btn-success' > > submit_btn['_value']='Save' > > return locals() > > > The create_grid function returns a grid and the links are like this: > > > links = [ > > lambda row: A('', _onclick="web2py_component('" + URL("contacts", "edit", > args=[row.id, company_id], user_signature=True) + "', 'tabContent');", > _class='icon-pencil'), > > lambda row: A('', _onclick="web2py_component('" + URL("contacts", > "delete", args=[row.id, company_id], user_signature=True) + "', > 'tabContent');", _class='icon-trash') > > ] > > If a click on a Delete link within the grid, this is what is called: > > > @auth.requires_login() > > def delete(): > > contact_id = request.args[0] > > company_id = request.args[1] > > crud.settings.hideerror=True > > > contact = db.contact[contact_id] or redirect(error_page) > > crud.delete(db.contact, contact.id, next=URL('contacts', 'index', > args=company_id, user_signature=True)) > > > The record is deleted OK and the index method is called OK and the grid > is re-appears. When I try to add a new record then the delete method is > called AGAIN rather than the index method. There is no problem adding > records if I don't do a delete first! > > > I don't understand what where I'm going wrong :( I suspect its to with > using web2py_component method within a partial (.load) file that was also > loaded via ajax and then trying to do a redirect from a method that was > invoked via ajax. > > > Kind Regards, > > Chris > > > --