Есть код на flask, где сравниваются страницы. перепиши его так, что бы можно было на странице в выпадающем списке выбирать сравниваемые или отображаемые поля в таблице. 
Ввреху страницы должна быть надпись Документ:"doc_name от doc_date".
Ниже вывести данные таблицей.
Сопоставление выполнять располагая рядом обозначенные ниже поля, при несовпадении подсвечивать красным. Дать возможность редактирования полей из hardware на странице.
На каждой из строк справа расположить кнопку "Заполнить из ОС", по которой данные по текущей записи по сравниваемым полям из OS переносятся в hardware. Внизу страницы расположить кнопку применить. По нажатию этой кнопки необходимо записать данные со страницы в таблицу hardware.
Поля для соспоставления:
таблица hardware:таблица os
-----------:----------------
inv: inv
sn:zn
quantity: quantity
shifr_time: code_norma_amort
shifr_amo:  отображать, но не сопоставлять
date_build: date_production
date_input: date_input
date_buh: date_expluatation
date_nouse: отображать, но не сопоставлять
first_price: price
last_price: last_price
srok: srok_polezn_use

вот текущий код страницы:
{% extends "base.html" %}
{% block title %}Сопоставление HW и OS{% endblock %}
{% block content %}
<h1>Сопоставление данных с ОС</h1>
<p>Документ: "{{ doc.doc_name }} от {{ doc.doc_date }}"</p>

<form method="POST">
  <table class="table table-bordered">
    <thead>
      <tr>
        <th>Hardware.inv</th>
        <th>OS.inv</th>
        <th>quantity</th>
        <th>OS.quantity</th>
        <th>shifr_time</th>
        <th>code_norma_amort</th>
        <th>date_build</th>
        <th>date_production</th>
        <!-- и т.д. -->
        <th>Заполнить из ОС</th>
      </tr>
    </thead>
    <tbody>
      {% for row in table_rows %}
        {% set hw = row.hw %}
        {% set os = row.os %}
        <tr>
          <td>{{ hw.inv }}</td>
          <td>{% if os %}{{ os.inv }}{% else %}<span class="text-danger">Нет OS</span>{% endif %}</td>

          <!-- quantity -->
          {% if hw.quantity != (os.quantity if os else None) %}
            <td style="background-color: #fdd;">
              <input type="text" name="hw_{{ hw.hw_id }}_quantity" value="{{ hw.quantity or '' }}" class="form-control" />
            </td>
            <td style="background-color: #fdd;">
              {{ os.quantity if os else '' }}
            </td>
          {% else %}
            <td>
              <input type="text" name="hw_{{ hw.hw_id }}_quantity" value="{{ hw.quantity or '' }}" class="form-control" />
            </td>
            <td>{{ os.quantity if os else '' }}</td>
          {% endif %}

          <!-- shifr_time vs code_norma_amort -->
          <td>
            <input type="text" name="hw_{{ hw.hw_id }}_shifr_time" value="{{ hw.shifr_time or '' }}" class="form-control" />
          </td>
          <td>
            {% if os %}{{ os.code_norma_amort }}{% endif %}
          </td>

          <!-- date_build vs date_production -->
          <td>
            <input type="text" name="hw_{{ hw.hw_id }}_date_build" 
                   value="{{ hw.date_build|strftime('%Y-%m-%d') if hw.date_build else '' }}" class="form-control" />
          </td>
          <td>
            {% if os and os.date_production %}{{ os.date_production }}{% endif %}
          </td>

          <!-- и т.д. для first_price vs price, last_price vs last_price, srok vs srok_polezn_use -->

          <td>
            {% if os %}
            <!-- JS-обработчик или простой submit: 
                 при клике подставлять os-значения в форму hw. -->
            <button type="button" class="btn btn-sm btn-info"
              onclick="fillFromOS({{ hw.hw_id }}, '{{ os.quantity }}', '{{ os.code_norma_amort }}', '{{ os.date_production }}' /* ... */)">
              Заполнить из ОС
            </button>
            {% endif %}
          </td>
        </tr>
      {% endfor %}
    </tbody>
  </table>

  <button type="submit" class="btn btn-success">Применить</button>
</form>

<script>
function fillFromOS(hw_id, os_quantity, os_code, os_date_build /* ... */) {
  // Пример: найти <input name="hw_hw_id_quantity">, заменить значение
  let qtyInput = document.querySelector(`input[name="hw_${hw_id}_quantity"]`);
  if (qtyInput) {
    qtyInput.value = os_quantity || "";
  }
  let shifrTimeInput = document.querySelector(`input[name="hw_${hw_id}_shifr_time"]`);
  if (shifrTimeInput) {
    shifrTimeInput.value = os_code || "";
  }
  let dateBuildInput = document.querySelector(`input[name="hw_${hw_id}_date_build"]`);
  if (dateBuildInput) {
    dateBuildInput.value = os_date_build || "";
  }
  // ... и т.д. Заполнить остальные поля
}
</script>
{% endblock %}

вот текущий код функции:

@hardware_bp.route("/hardware_assoc/os/<int:doc_id>", methods=["GET", "POST"])
def hardware_assoc_os(doc_id):
    """
    Страница "Сопоставление данных с ОС".
    Вверху: Документ: "doc_name от doc_date"
    Ниже: таблица сопоставления Hardware ↔ OS, поля (inv, quantity, shifr_time → code_norma_amort, ...)
    При несовпадении подсвечивать красным.
    Можно редактировать Hardware-поля.
    Кнопка "Заполнить из ОС" (на каждой строке) - перенести данные OS в Hardware (только в виде form на странице, до "Применить").
    Кнопка "Применить" -> сохраняем изменения в БД.
    """
    doc = Landocs.query.get_or_404(doc_id)
    # Загружаем hardware
    hw_list = Hardware.query.filter_by(doc_id=doc_id).all()

    # Готовим данные для отображения (список словарей {hw:..., os:...})
    table_rows = []
    for hw in hw_list:
        os_ = OS.query.filter_by(inv=hw.inv).first()
        table_rows.append({
            'hw': hw,
            'os': os_
        })
    
    if request.method == "POST":
        # Если нажали "Применить" (или какая-то форма):
        # Будем считывать поля из request.form и сохранять в Hardware
        for hw in hw_list:
            prefix = f"hw_{hw.hw_id}"
            # Пример: quantity -> request.form.get(f"{prefix}_quantity")
            new_quantity = request.form.get(f"{prefix}_quantity")
            new_shifr_time = request.form.get(f"{prefix}_shifr_time")
            new_date_build = request.form.get(f"{prefix}_date_build")
            # ... и т.д.

            # Преобразование
            hw.quantity = parse_int(new_quantity)
            hw.shifr_time = parse_int(new_shifr_time)
            hw.date_build = parse_date(new_date_build)
            # Дополнительно поля first_price, last_price, srok и т.д.
            # (Смотрите ниже, какие поля сопоставлялись.)

        try:
            db.session.commit()
            flash("Изменения Hardware успешно сохранены.", "success")
        except Exception as e:
            db.session.rollback()
            flash(f"Ошибка при сохранении: {e}", "danger")
        return redirect(url_for("hardware_bp.hardware_assoc_os", doc_id=doc_id))

    # GET-запрос: просто отображаем страницу
    return render_template(
        "hw_assoc_os.html",
        doc=doc,
        table_rows=table_rows
    )