#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 Я надеюсь, что смог помочь вам реализовать ваш проект. Оставьте мне комментарий, если я вас неправильно понял.