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
--