form.accepts(request.vars,session) will create three hidden fields: id, 
_formname and _formkey -- if your jQuery post request doesn't send back 
those hidden fields with matching values, the form will not accept. By 
default, the _formname will be 'foo/[record id]', though you can override 
that by specifying form.accepts(...,formname='yourform'). The _formkey field 
is a one-time token and is only created if you pass session to form.accepts 
(to prevent CSRF attacks and double submission). If you don't want to use 
_formkey, then call form.accepts without session. Otherwise, you'll need to 
pass the _formkey value to the view and have the jQuery post send it back. 
Without session (and the formkey), something like this in the view:

var new_data = {id: '[record id to be updated]', name: 'new foo name', 
_formname: 'fooform'}; 

Alternatively, instead of form.accepts, you could do 
db.foo.validate_and_update(id=record.id,name=request.vars.name).

See http://web2py.com/book/default/chapter/07#Hidden-fields 
and http://web2py.com/book/default/chapter/07#SQLFORM-and-insert/update/delete.

Anthony

On Friday, September 9, 2011 1:01:13 PM UTC-4, GD wrote:
>
> Hi, 
> given this model: 
>
>     db.define_table('foo', 
>         Field('name')) 
>
> a jquery function in the view: 
>
>     var new_data = {name: 'new foo name'}; 
>     $.post( 
>         url, 
>         new_data, 
>         function(result){ 
>              // some kind of action upon success 
>         }, 
>         'json' 
>     ); 
>
> let's say that url is already built in order to take the record id as 
> an argument, 
> so the controller has the following "behavior": 
>
> def update(): 
>     record = db.foo(request.args(0))  # this works 
>     form = SQLFORM(db.foo, record)  # this works 
>     if form.accepts(request.vars, session):  # this is never hit 
>         return dict(message='record updated') 
>     else: 
>         return dict(message='data did not validate')  # this is always 
> hit 
>
> so the questions are 
> why it doesn't validate? 
> If it is not because any mistake on my side: is this an intended 
> behavior? 
> If it is intended: how is it possible to validate data passed 
> "programmatically" by a jquery function without human direct input? 
>
> Thanks

Reply via email to