Hi Anthony,
it works! Thank you very much! And I think I can a little bit more
understand what form.accepts does.

By the way - "*There's probably a more elegant way to handle this,"  *
Could you give me a hint about another way?*
*

2011/8/23 Anthony <abasta...@gmail.com>

> I see. I saw you were making an Ajax post request and assumed that was
> supposed to be the form submission. If you're just using Ajax to pull the
> form html, you can do a get request (the default if you don't specify a
> method).
>
> I think the problem is that when you first call form.accepts when
> submittest is loaded, it adds the _formname and _formkey hidden fields to
> the form. However, the form ultimately displayed on the page and submitted
> is generated by ajax(), and does not include the _formname or _formkey
> hidden fields. So, when the form is submitted back to submittest,
> form.accepts fails because of the missing hidden fields. There's probably a
> more elegant way to handle this, but keeping as close to your original code
> as possible, I think it would be something like this:
>
> def submittest():
>     script = SCRIPT("""
>     function lf() {
>       jQuery.ajax({url: 'ajax',
>
>       success: function(msg) {jQuery('#chk').html(msg); } })};
>     """)  # note, no need to make it a POST request
>
>     menu = MENU([['LoadForm',False,'javascript:lf()']])
>     form = FORM(_name='myform')
>     result = 'No result'
>     if request.vars and form.accepts(request.vars,session):  # only call
> .accepts upon submission
>         result = request.vars.test
>     return dict(menu=menu, script=script, result=result)  # no need to
> return 'form' or display in view
>
> def ajax():
>     checkboxes = [DIV(INPUT(_type='checkbox',_name='test', _value=v, ),v)
> for v in ['a','b','c']]
>     form=FORM(INPUT(_type="submit"), *checkboxes,_name='myform')
>     form.accepts(request.vars,session)  # this will add the hidden fields
>     return form  # no need to do str(form) -- returned helpers are
> automatically serialized
>
>
> Anthony
>
>
> On Tuesday, August 23, 2011 1:11:03 PM UTC-4, mweissen wrote:
>
>> The whole demo program works fine:  the form appears. If I add an
>> "action=..." in "FORM(INPUT(_type="submit"), *checkboxes,_name='myform')"
>> another page is called (as expected).
>>
>> The problem is that there is no value in request.vars.
>>
>> I don't know whether it is possible to add a form, which can be recognized
>> by "form.accepts". Something must be wrong, but I think, it is not
>>  ajax-call..
>>
>> 2011/8/23 Anthony <abas...@gmail.com>
>>
>> I don't think you are using jQuery.ajax correctly. The url should be the
>>> url to which the submitted form data should be sent. Also, the jQuery.ajax
>>> call does not appear to actually send any data (it takes a 'data' argument).
>>> See
>>> http://code.google.com/p/web2py/source/browse/applications/welcome/static/js/web2py_ajax.js#54
>>>  for
>>> how web2py handles Ajax form submission.
>>>
>>> Anthony
>>>
>>> On Tuesday, August 23, 2011 11:04:01 AM UTC-4, mweissen wrote:
>>>
>>>> Hi,
>>>>
>>>> I want do create a "dynamic form":
>>>> (1) On the top of a page there are several questions and
>>>> (2) at the end of the page a form should appear.
>>>>
>>>> The content of the form depends on the answers of step (1).
>>>> Therefore I tried to insert this new form using ajax.
>>>> Result: the form appears, the submit-button works, but the content of
>>>> request.vars is always None.
>>>>
>>>> Here is the controller:
>>>>
>>>> def submittest():
>>>>     script = SCRIPT("""
>>>>     function lf() {
>>>>       jQuery.ajax({type: 'POST', url: 'ajax',
>>>>     success: function(msg) {jQuery('#chk').html(msg); } })};
>>>>     """)
>>>>
>>>>     menu = MENU([['LoadForm',False,'javascript:lf()']])
>>>>     form = FORM(_name="myform")
>>>>     if form.accepts(request.vars, session):
>>>>       result = request.vars.test
>>>>     else:
>>>>       result = 'No result'
>>>>
>>>>    return dict(menu=menu, script=script, result=result, form=form)
>>>>
>>>> def ajax():
>>>>     checkboxes = [DIV(INPUT(_type='checkbox',_name='test', _value=v,
>>>> ),v) for v in ['a','b','c']]
>>>>     return str(FORM(INPUT(_type="submit"), *checkboxes,_name='myform'))
>>>>
>>>> And the view:
>>>>
>>>> {{extend 'layout.html'}}
>>>> <h1>Submit</h1>
>>>> {{=menu}}
>>>> {{=script}}
>>>> <div id='chk'>{{=form}}</div>
>>>> Result: {{=result}}
>>>>
>>>> Maybe the problem is the line  form = FORM(_name="myform")
>>>> Without this line form.accepts does not work. Two forms, one from the
>>>> controller, one created by ajax?
>>>>
>>>> Regards, Martin
>>>>
>>>
>>
>>

Reply via email to