Выбор указанной c записи из WTForm для редактирования и передача идентификатора в flask маршрут - PullRequest
0 голосов
/ 01 апреля 2020

Я учусь Python и у меня есть учебный проект, как я go. Я использую wtforms, flask -wtf, sqlalchemy и базу данных MySQL. У меня есть панель управления, которая выводит количество записей, связанных с указанным пользователем c, каждая строка имеет свою собственную кнопку отправки, которая ведет меня к маршруту для редактирования записи. У меня уже есть работающая кнопка добавления и кнопка выхода из системы.
Однако моя проблема в том, что при нажатии на кнопку «Изменить», которую я нажимаю, я могу редактировать только первую запись, так как у меня нет способа определить, какую кнопку я нажал и, следовательно, какую запись она была. для и, следовательно, какую запись для редактирования.

Приложение имеет 2 таблицы в настоящее время - пользователь и танк.

Код формы

class DashboardForm(FlaskForm):
    edit = SubmitField('Edit')
    add = SubmitField('Add New Tank')
    logout = SubmitField('Logout')

Маршруты

@app.route('/', methods=['GET','POST'])
@login_required
def dashboard():

    dashboard_form = DashboardForm()
    tanks = Tank.query.filter_by(owner_id=current_user.id)

    if request.method == 'POST':
        if dashboard_form.validate_on_submit():
            if dashboard_form.logout.data:
                return redirect(url_for('logout'))

            if dashboard_form.edit.data:
                return redirect(url_for('edit_tank'))

            if dashboard_form.add.data:
                return redirect(url_for('add_tank'))

    """Serve logged-in Dashboard."""
    return render_template('dashboard.html',
                           title='Your Fish Tank',
                           template='dashboard-template',
                           current_user=current_user,
                           form=dashboard_form,
                           tanks = tanks,
                           body="You are now logged in!")

@app.route("/edit_tank", methods = ['GET', 'POST'])
@login_required
def edit_tank():

    tank = Tank.query.filter_by(owner_id=current_user.id).first()
    tank_form = TankForm(obj=tank)

    if request.method == 'POST':
        if tank_form.cancel.data:
            return redirect(url_for('dashboard'))

    if tank_form.validate_on_submit():
        if tank_form.add.data:
            tank_form.populate_obj(tank)
            db.session.commit()
            return redirect(url_for('dashboard'))

    return render_template('add_tank.html', form=tank_form, title='Edit Tank Details')

HTML шаблон для приборной панели

{% extends "base page.html" %}

{% block content %}

<br><br>
<form method="POST">
    {{ form.hidden_tag() }}

    <table>

    <tr>
        <th> Tank Name  </th>
        <th> Size (litres) </th>
        <th> Type </th>
    </tr>
        {% for tank in tanks %}
        <tr>
            <td> {{ tank.tank_name }} </td>
            <td> {{ tank.size_litres }} </td>
            <td> {{ tank.tank_type }} </td>
            <td> {{ form.edit }} </td>
        </tr>
        {% endfor %}

        </tr>
    </table>
    <br><br>
    {{ form.add }}
    {{ form.logout }}

</form>

Я знаю, что фильтр запросов на маршруте edit_tank извлекает только первое значение - это просто для того, чтобы он хотя бы позволил мне выполнить код, и он не потерпит неудачу. Теперь я хочу изменить этот запрос, чтобы выбрать конкретную запись c, основанную на том, что нажимается на панели инструментов. Может быть, то, как я это сделал, неосуществимо, но у кого-нибудь есть идеи, пожалуйста

...