Передача переменной из шаблона jinja2 в маршрут во Flask - PullRequest
0 голосов
/ 03 мая 2018

У меня есть форма поиска на моей странице, когда вы что-то вводите, я отображаю тот же шаблон, но результаты поиска выводятся пользователю в виде списка. Пользователь может нажать на результаты, которые ему нравятся. Если пользователю нравится результат (нажав на кнопку «Мне нравится»), я хочу передать эти данные обратно на мой маршрут, чтобы выполнить некоторую повторную обработку результатов. Когда пользователь нажимает на кнопку «Мне нравится», как я могу передать значение переменной из моего шаблона в маршрут без обновления всей страницы?

<form class="form-container" method="POST" action="">
  <div class="row">
    <div class="col-sm-12 form-group">
      <input type="text" name="input" id="input" autofocus placeholder="Type your query here!" autocomplete="off" />
    </div>
  </div>
  <input type="submit" style="display:none" />
</form>

{% if output %}
{% for result in output %}
<div>
{{result}}
<span type="button" id={{tag_like_btn}}><i style="color: red" class="fas fa-heart"></i></span>
</div>
{% endfor %}
{% endif %}
@irsystem.route('search', methods=['GET', 'POST'])
def search():
    print ("search")
    form = request.form
    form_submitted = False
    if request.method == 'POST':
        print ("Form submitted...")
        form_submitted = True
        results = [("Article1", 60), ("Article2", 50), ("Article 3", 40)]
        return render_template('search.html', form=form, form_submitted_status=form_submitted, output=results)
    return render_template('search.html', form=form)

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вам нужно использовать ajax для питания динамической страницы. Сначала создайте страницу поиска с ajax в разделе script и другим фрагментом HTML в своем собственном файле с шаблоном для отображения результатов:

search.html

<html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  </head>
  <input type="text" id="search">
  <button type='button' id='search_button'>Search</button>
  <div id='place_for_results'></div>
  <script>
     $(document).ready(function() {
        $('#search_button').click(function(){
            var query = $('#search').val();
           $.ajax({
            url: "/search_result",
           type: "get",
           data: {search:query},
           success: function(response) {
            $("#place_for_results").html(response.results);
            },
          error: function(xhr) {
           //Do Something to handle error
          }
         });
        });
     });
  </script>
</html>

results.html:

{%for result in results%}
   <div>
     {{result.val}}
     <span type="button" id={{result.btn}}><i style="color: red" class="fas fa-heart"></i></span>
  </div>
 {%endfor%}

Затем в app.py создайте маршрут для визуализации search.html и другой маршрут /search_result для получения запроса:

from collections import namedtuple
@app.route('/search', methods=['GET'])
def search():
  return flask.render_template('search.html')

@app.route('/search_result')
def search_for():
   query = flask.request.args.get('search')
   result = namedtuple('result', ['val', 'btn'])
   vals = [("Article1", 60), ("Article2", 50), ("Article 3", 40)]
   #below is a very simple search algorithm to filter vals based on user input:
   html = flask.render_template('results.html', results=[result(a, b) for a, b in vals if query.lower() in a.lower()])
   return flask.jsonify({'results':html})
0 голосов
/ 03 мая 2018

Если вы хотите запустить такую ​​произвольную логику без перезагрузки страницы, вам нужно обработать отправку запроса AJAX с JavaScript. Затем ваш обработчик поиска Flask (или, в идеале, отдельный обработчик с методом GET) должен возвратить некоторый облегченный JSON с данными найденных статей. После того, как JavaScript получит данные обратно с сервера Flask, он должен динамически создавать элементы DOM и заполнять их полученными данными.

Чтобы сделать код проще для понимания, я бы всегда отображал полученную таблицу с помощью JavaScript - таким образом вам не нужно дублировать код в шаблоне Flask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...