有没有办法使用Flask(jinja2)从用户输入的HTML表格中删除行?

时间:2019-02-15 13:30:56

标签: jinja2 flask-sqlalchemy flask-wtforms

我是Flask和编程的新手。我正在使用Flask / SQLite创建一个简单的数据库。我正在让用户以表单形式输入数据,并将该数据填充在表单旁边的HTML表格中。我已经做到了。但是,我想增加用户删除表中行的功能。

我已经在我的routes.py中创建了一个我想利用的函数,但是我找不到将用户提交的信息传递回我的route.py函数的方法。我尝试使用HTML链接,但不想将用户传递到另一个URL并返回。有没有办法做到这一点?

从routes.py

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

    qinter = Interventions.query.all()

    def delete_entry(entry):

        db.session.delete(qinter[(entry-1)])
        db.session.commit()
        return redirect(url_for('interventions'))
 .....

来自Interventions.html

.........

    <table border="1">
        <tr>
            <th>Delete?</th>
            <th>Date</th>
            <th>Chart #</th>
            <th>Provider</th>
            <th>Pharmacist</th>
            <th>COI</th>
            <th>Accepted?</th>
            <th>Intervention</th>
        </tr          
        {% for q in qinter %}
            <tr>
                <td><<a href="{{ delete_entry(q) }}">delete</a></td>
                <td>{{  q.date  }}</td>
                <td>{{  q.chart  }}</td>
                <td>{{  q.prescriber  }}</td>
                <td>{{  q.pharmacist  }}</td>
                <td>{{  q.category  }}</td>
                <td>{{  q.accepted  }}</td>
                <td>{{  q.intervention  }}</td>
            </tr>
         {% endfor %}
    </table>

1 个答案:

答案 0 :(得分:0)

您需要的是一种从HTML模板到干预路径进行通信的方法,该方法要删除数据库表中的特定行。为此,您需要向路由功能添加一些其他参数,例如:

@app.route('/interventions', methods=['GET', 'POST'])
@app.route('/interventions/<action>/<item_id>', methods=['GET', 'POST'])
@login_required
def interventions(action=None, item_id=None):

    def delete_entry(entry):

        db.session.delete(entry)
        db.session.commit()


    if request.method == "POST":

        if action == 'delete':

            # Get specific row user wants to delete
            qinter_row_to_delete = Interventions.query.get(item_id)

            # Delete row
            delete_entry(qinter_row_to_delete)

            return redirect(url_for('interventions'))


    elif request.method == "GET":

        qinter = Interventions.query.all()

        # Render template etc...

然后从Jinja模板调用该端点以删除行:

<form id="form" action="{{url_for('interventions', action='delete', item_id=q.id)}}" method="POST">