Как получить HTML-теги ‹tr› при нажатии кнопки в Flask?

Мой HTML-шаблон имеет форму, которая выглядит в браузере следующим образом:

введите здесь описание изображения

Я хочу получить строку «апельсины» в Python, когда пользователь нажимает кнопку «Выбрать» рядом с «апельсинами».

Вот как выглядит моя форма:

<form action="{{url_for('select')}}" method="POST">
  <div class="available_flights">
    {% for product in [["A100", "oranges"], ["A101", "apples"]] %}
    <td name = {{product[0]}} > {{product[1]}} {% include select_button ignore missing %} </td><br>
    {% endfor %}
  </div>
</form>

Попытка request.form["A100"] возвращает ошибку неверного запроса. Есть ли способ получить такие значения тегов tr?


person multigoodverse    schedule 04.10.2018    source источник


Ответы (1)


Вы можете создать уникальные идентификаторы для каждого из ваших элементов, которые вы будете отображать. Каждая td и соответствующая ей кнопка будут иметь конечную цифру в id, которую можно использовать для захвата нужного текста при нажатии кнопки. Кроме того, в этом случае проще использовать jquery с ajax для связи с серверной частью:

В вашем HTML:

flights.html

<html>
   <head>
       <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
   </head>
   <div class='available_flights'> 
    {%for row in data%}
       <td id='listing{{row.id}}' class='{{row.flight}}'>{{row.name}}</td>
       <button id = 'button{{row.id}}' class='select_td'>Select</button>
       <div id='info{{row.id}}'></div>
    {%endfor%}
   </div>
  <script>
    $(document).ready(function(){
      $('.available_flights').on('click', '.select_td', function(){
         var _id = this.id.match('\\d+');
         var flight_name = $('#listing'+_id).text();
         var abbrev = $('#listing'+_id).attr('class');
         $.ajax({
           url: "/get_flight",
           type: "get",
           data: {flight: flight_name, id:_id, name:abbrev},
           success: function(response) {
            $("#info"+_id).html(response.result);
           }
          });
      });
    });
  </script>
</html>

Затем в приложении:

import flask, typing
app = flask.Flask(__name__)

class Flight(typing.NamedTuple):
  id:int
  flight:str
  name:str

@app.route('/', methods=['GET'])
def home():
   d = [["A100", "oranges"], ["A101", "apples"]]
   return flask.render_template('flights.html', data=[Flight(i, a, b) for i, [a, b] in enumerate(d)])

 @app.route('/get_flight')
 def get_flight():
   d = [["A100", "oranges"], ["A101", "apples"]]
   flight_id = int(flask.request.args.get('id'))
   flight_name = flask.request.args.get('flight')
   flight_abbreviation = flask.request.args.get('name')
   selected = dict(d)[flight_abbreviation]
   return flask.jsonify({"result":f'<p>Thank you for choosing {flight_name}</p>'})
person Ajax1234    schedule 04.10.2018