2016-03-19 2 views
1

Я пытаюсь отправить форму с использованием функции ajax в web2py как explained in the book, но используя FORM вместо SQLFORM, так как я не хочу, чтобы данные хранились в базе данных.Как проверить форму web2py, представленную через AJAX?

ajax_test.html

{{extend "layout.html"}} 
<h2>Form</h2> 
{{=form}} 
<script> 
    jQuery("#myform").submit(function() { 
    ajax("{{=URL('ajax_test')}}", 
     ["mytext"], "output"); 
    return false; 
    }); 
</script> 
<h2>Output</h2> 
<div id="output"></div> 

Контроллер внутри default.py:

def ajax_test(): 
    form = FORM(
     INPUT(_type="text", _name="mytext", _id="mytext", 
       requires=IS_NOT_EMPTY()), 
     INPUT(_type="submit"), 
     _id="myform" 
    ) 

    if request.ajax: 
     if form.accepts(request.vars, session): 
      return DIV("Form submitted.") 
     elif form.errors: 
      return TABLE(*[TR(k, v) for k, v in form.errors.items()]) 
     else: 
      return DIV("Couldn't check form.") 

    return dict(form=form) 

Когда форма отправлена ​​(request.ajax == True), оба form.accepts и form.errors возвращение False. Несмотря на то, что я получаю доступ к пользовательскому вводу через request.vars.mytext, тогда мне нужно будет его проверить самостоятельно, а не использовать возможности web2py.

Что мне не хватает?

ответ

3

Когда вы передаете объект session на номер form.accepts(), он автоматически реализует защиту подделки на основе межсайтового запроса путем добавления в форму скрытого поля _formkey. Когда форма отправляется, значение этого скрытого поля сравнивается со значением, хранящимся в сеансе, и форма не принимается, если совпадение не выполняется.

Есть две проблемы с вашим кодом. Во-первых, вы вызываете только form.accepts, когда есть запрос Ajax, поэтому _formkey не генерируется и не включается в исходную форму. Чтобы исправить это, попробуйте следующее:

form.process() 
if request.ajax: 
    if form.accepted: 

form.process() это просто ярлык для form.accepts(request, session). Выше, он вызывается даже для начального вызова без Ajax при создании формы. Это создаст значение _formkey и сохранит его в сеансе.

Во-вторых, ваш код Javascript не представляет всю форму, а только поле mytext, поэтому значение скрытого _formkey не будет отправлено обратно на сервер. В результате форма не принимается (в этом случае web2py не отображает ошибку, поскольку такой отказ обычно является результатом нецензурной игры).

Я не уверен, что это задокументировано, но второй аргумент функции ajax() может быть селектором jQuery, который приведет к тому, что все элементы формы внутри выбранного элемента будут сериализованы и представлены. Итак, попробуйте:

ajax('{{=URL('ajax_test')}}', '#myform', 'output'); 

Селектор #myform приведет всю форму сериализации, в том числе скрытые поля, входящие в form объекта.

+0

Привет Антоний благодарит за ответ. Я изменил второй аргумент на '" #myform ", но я получаю тот же результат. Я знал о скрытом значении '_formkey', но по какой-то причине он не генерируется. HTML-код формы: '

'. Есть идеи? – cdonts

+0

См. Обновленный ответ. Вы должны обработать форму, когда она изначально создана, так что код не может находиться внутри блока if if.hax:. – Anthony

+0

Отлично! Большое спасибо. – cdonts

Смежные вопросы