Ошибка при вызове AJAX для фляги render_template - PullRequest
0 голосов
/ 30 января 2019

Предположим, у меня есть две радиокнопки (с метками 1 и 2) и немного текста внизу страницы.По умолчанию значение -1 для текста, и флажки не установлены.Если я нажимаю одну из переключателей, я хочу изменить значение текста на 1 или 2 в зависимости от выбранного радиовхода.Для этого я основал код на вызове AJAX, описанном здесь .Вот код:

hello.py

from flask import (
    Flask, render_template, request
)

app = Flask(__name__)


@app.route('/', methods=('GET', 'POST'))
def hello():
    level = -1
    print(request.method)
    if request.method == 'POST':
        level = int(request.form.get('level', False))
    return render_template('test.html', value=level)

templates/test.html

<html>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
  <body>
    <form>
      <input name="level" type="radio" id="1">1</input>
      <input name="level" type="radio" id="2">2</input>
    </form>
    {{ value }}
  </body>
  <script>
    $(function() {
      $('input[type=radio]').change(function() {
        console.log( $( this ).attr("id"));
        $.ajax({
          type: "POST",
          data: { level: $( this ).attr("id") },
          success: function(response) {
            console.log("HERE");
            document.write(response);
          },
        });
      });
    });
  </script>
</html>

Когда я звоню flask run, выбор радиокнопки изменит значениелибо 1, либо 2, но я не могу выбрать один из переключателей во второй раз.Страница будет зависать при втором выборе, и я не уверен, что происходит.

Примечание: хотя это может показаться излишним, у меня есть более сложная форма отправки в более крупном проекте, над которым я работаю,это просто MVCE.

1 Ответ

0 голосов
/ 30 января 2019

Поскольку создается динамическое содержимое, необходимо привязать обработчик события change к внешнему тегу:

<html>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"> </script>
  <body>
   <div class='wrapper'>
   <form>
     <input name="level" type="radio" id="1">1</input>
     <input name="level" type="radio" id="2">2</input>
   </form>
    <p>{{ value }}</p>
  </div>
 </body>
 <script>
  $(document).ready(function(){
    $('.wrapper').on('change', 'input[type=radio]', function(){
       console.log( $( this ).attr("id"));
       $.ajax({
       type: "POST",
       data: { level: $( this ).attr("id") },
       success: function(response) {
        console.log("HERE");
        $('p').text(response.toString());
      },
    });
    });
  });
  </script>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...