Задать вопрос
@Atroshchenko-Dima
Python, postgres

Как реализовать возможность выбора столбцов для выгрузки с БД на сайт?

На данный момент реализовано 3 select multiple с возможностью выбора нужных наименований из столбцов.
Все работает корректно.
Подскажите, пожалуйста, как аналогично реализовать возможность выбора самих столбцов?

index.html

<label for="columns">  </label>
    <select type="text" id = "columns" name ="columns" class="form-control selectpicker" data-live-search="true" multiple>
      <option value="fact_year">Год</option>
      <option value="fact_january">Январь</option>
      <option value="fact_february">Февраль</option>
      <option value="fact_march">Март</option>
      <option value="fact_q1">1 Квартал</option>
      <option value="fact_aplril">Апрель</option>
      <option value="fact_june">Июнь</option>
      <option value="fact_q2">2 Квартал</option>
      <option value="fact_jule">Июль</option>
      <option value="fact_august">Август</option>
      <option value="fact_september">Сентябрь</option>
      <option value="fact_q3">3 Квартал</option>
      <option value="fact_october">Октябрь</option>
      <option value="fact_november">Ноябрь</option>
      <option value="fact_december">Декабрь</option>
      <option value="fact_q4">4 Квартал</option>
      <option value="fact_annual_values">Итог</option>
    </select><br><br>


app.py
@app.route("/", methods=["GET","POST"])
def index():
    cur = conn.cursor()
    cur.execute("SELECT * FROM fact_indicators;") 
    rows = cur.fetchall()
    cur.close
    
    if request.method == "POST":
        # Получаем промежуток дат из формы
        year = request.form.getlist("year")
        year = [int(i) for i in request.form.getlist("year") if i.isdigit()]
        print(year)
        station = request.form.getlist("station")
        station = [str(i) for i in request.form.getlist("station")]
        print(station)
        indicators = request.form.getlist("indicators")
        indicators = [str(i) for i in request.form.getlist("indicators")]
        print(indicators)
        columns = request.form.getlist("columns")
        columns = [i for i in request.form.getlist("columns")]
        # Форматируем даты в соответсвии с форматом в базе данных
        # Запрос к БД с использованием параметров дат
        cur = conn.cursor()
        cur.execute("SELECT * FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_indicators = ANY(%s) AND fact_station_name = ANY(%s);",(year, indicators, station)) 
        rows = cur.fetchall()
        cur.close
        # Отоброжение полученных данных на странице
        return render_template("index.html", rows=rows, form_visible=True)
    else:
        return render_template("index.html", rows=rows, form_visible=False)
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Atroshchenko-Dima Автор вопроса
Python, postgres
Нашел решение, может быть пригодится потом кому-нибудь.

columns обрабатываем аналогично переменным year и station.
sql запрос будет выглядеть так
cur.execute("SELECT {} FROM fact_indicators WHERE fact_year = ANY(%s) AND fact_indicators = ANY(%s) AND fact_station_name = ANY(%s);".format(",".join(["\"{}\"".format(c) for c in columns])),(year, indicators, station))


index.html

<table class="table-fill">
  <thead>
    <tr>
      {% for column in columns %}
      <th>{{ column }}</th>
      {% endfor %}
    </tr>
  </thead>

{% for row in rows %}
    <tr>
      {% for column in columns %}
      <td>{{ row[loop.index0] }}</td>
      {% endfor %}
    </tr>
{% endfor %}
    </tbody>
  </table>
</body>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы