Отображение массива Javascript Flask в html?

#javascript #flask

Вопрос:

У меня есть массив, отображаемый в моем маршруте колбы. У меня это отображается с помощью этого кода:

 lt;scriptgt;  var purchases = JSON.parse('{{ purchase | safe }}');  console.log(purchases)  lt;/scriptgt;  

Однако я пытаюсь просмотреть покупки в DOM с помощью кода ниже и ничего не получаю.

 {% for p in purchases %}  {{ p.MLSNumber }}  {% endfor %}  

Массив есть, просто, похоже, не может получить к нему доступ (вот пример консоли)

 (9) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}] 0: {BedsTotal: '2', ListPrice: 99500, MLSAreaMinor: 'Williams', MLSNumber: '7058585', PostalCode: '80821', …} 1: {BedsTotal: '1', ListPrice: 58000, MLSAreaMinor: 'Ramah', MLSNumber: '9555642', PostalCode: '64620', …} 2: {BedsTotal: '1', ListPrice: 90000, MLSAreaMinor: 'Unknown', MLSNumber: '1936385', PostalCode: '81006', …}  

Где я ошибаюсь?

Комментарии:

1. У вас есть массив, отформатированный в формате JSON. Если вы хотите выполнить итерацию, вам следует использовать Javascript. Jinja2 следует использовать на сервере во время рендеринга. Например, просматривать списки и диктанты Python и интегрировать их содержимое в HTML-код. JavaScript используется для работы в браузере, то есть в клиенте, и может обрабатывать данные JSON / JavaScript. Каковы ваши намерения? Почему вы используете данные JSON и что следует делать с этими данными?

2. Хорошие вопросы. Я пытаюсь понять, как это должно происходить. Но вот что происходит: 1. У меня есть запрос на список домов 2. Я получаю этот объект, преобразую его в DF Pandas для фильтрации 3. Я преобразую этот фрейм данных в словарь 4. У меня есть функция фильтрации в словаре, результаты которой я пытаюсь отобразить на странице, Когда я возвращаю только список (отфильтрованный словарь), я получаю «функция просмотра не вернула действительный ответ». Единственным способом возврата отфильтрованного объекта, который я нашел, кажется, является этот массив, отформатированный в JSON.

Ответ №1:

Как я вас понимаю, вы хотите отфильтровать список домов на основе указания максимальной цены. В этом случае вы можете использовать JSON, но это не является абсолютно необходимым. Особенно, если вы не хотите загружать данные в запрос AJAX, я бы этого избежал.

В следующем примере данные формы передаются на сервер, указанный вами словарь фильтруется, и результаты отображаются на странице.
В отличие от вас, я использую запрос GET для простоты. Значения отправляются в качестве параметров в URL-адресе. Но нет ничего против использования почтового запроса для передачи данных формы в теле запроса и для защиты его от глаз третьих лиц.
В обоих вариантах входные данные могут быть преобразованы в значение с плавающей точкой, когда запрос выполняется из объекта запроса, путем указания атрибута type. Также можно указать значение по умолчанию.
Я использую пользовательский фильтр jinja2 для форматирования цены.

 from flask import Flask from flask import render_template, request import pandas as pd  app = Flask(__name__)  @app.template_filter() def format_currency(value):  return "$ {:,.2f}".format(value)  df = pd.DataFrame.from_dict({  'MLSNumber': [9504716, 4426383],  'ListPrice': [659849.00, 1500000.00],  'BedsTotal': [4, 4],  'MLSAreaMinor': ['Greenways At Sand Creek', 'Keene Ranch'],  'StreetNumber': [3819, 3231],  'StreetName': ['Ivy Hill', 'Castle Butte'],  'PostalCode': [80922, 80109],  'TaxAmount': [200.00, 4967.00], })  @app.route('/') def index():  price = request.args.get('income', 12000.00, type=float)   items = df.to_dict(orient='records')  items = [item for item in items if item['ListPrice'] lt;= price]   return render_template('index.html', items=items, income=price)  
 lt;!DOCTYPE htmlgt; lt;htmlgt;  lt;headgt;  lt;meta charset="utf-8"gt;  lt;titlegt;lt;/titlegt;  lt;/headgt;  lt;bodygt;  lt;div style="margin-bottom: 1.5rem;"gt;  lt;formgt;  lt;divgt;  lt;label for="income"gt;Incomelt;/labelgt;  lt;input type="NUMBER" step="0.01" name="income" id="income" value="{{ '{:.2f}'.format(income) }}" /gt;  lt;/divgt;  lt;input type="submit" /gt;  lt;/formgt;  lt;/divgt;   lt;divgt;  {% if items -%}  lt;tablegt;  lt;theadgt;  lt;trgt;  lt;thgt;StreetNamelt;/thgt;  lt;thgt;StreetNumberlt;/thgt;  lt;thgt;PostalCodelt;/thgt;  lt;thgt;MLSNumberlt;/thgt;  lt;thgt;MLSAreaMinorlt;/thgt;  lt;thgt;ListPricelt;/thgt;  lt;thgt;TaxAmountlt;/thgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  {% for item in items %}  lt;trgt;  lt;tdgt;{{item['StreetName']}}lt;/tdgt;  lt;tdgt;{{item['StreetNumber']}}lt;/tdgt;  lt;tdgt;{{item['PostalCode']}}lt;/tdgt;  lt;tdgt;{{item['MLSNumber']}}lt;/tdgt;  lt;tdgt;{{item['MLSAreaMinor']}}lt;/tdgt;  lt;tdgt;{{item['ListPrice'] | format_currency}}lt;/tdgt;  lt;tdgt;{{item['TaxAmount'] | format_currency}}lt;/tdgt;  lt;/trgt;  {% endfor %}  lt;/tbodygt;  lt;/tablegt;  {% else -%}  lt;spangt;No items found.lt;/spangt;  {% endif %}  lt;/bodygt; lt;/htmlgt;  

Комментарии:

1. @robthompson Я надеюсь, что смог помочь вам реализовать ваш проект. Оставьте мне комментарий, если я вас неправильно понял.