flask, 如何处理 ponyorm 中的 update?

2016-09-05 17:35:29 +08:00
 suueyoung

正在使用ponyorm尝试弄出一个基于flask的网站. 但是在处理 update 的时候发现怎么弄都弄不好.

处理 update 的 view 如下. 可是在实际情况中是点了 submit 之后, redirect 到的 index.html 页面上显示的数据信息根本就没有 update 到.

目前的 active 是 False, 我想在通过选择 active 到 True 然后点击 submit:

  1. 把 active 保存到数据库;
  2. 之后重定向到 index.html.
@app.route('/update/<int:id>', methods=('GET', 'POST'))
@db_session
def update(id):
    record = Tconfused.get(lambda p: p.id == id)

    form = UpdateForm()
    form.id.data = record.id
    form.active.data = record.active
    form.url.data = record.url

    if request.method == 'POST' and form.validate_on_submit():
        record.active = form.active.data
        record.url = form.url.data.strip()
        return redirect(url_for('index'))
    return render_template('update.html', record=record, form=form)

从 f12 看见的 form data 也都没有错误

csrf_token:1473071404##a662b5cd7428bb709b74372a0d12eed2d9c26b32
active:1
url:http://www.google.com

请问, 要达到我的目的, 这个 view 里面有关数据库操作的部分要怎么写呢? 这里是完整的 3 个文件代码:

confused.py
import os
from pony.orm import Database, db_session, Required, Optional
from flask import Flask, redirect, url_for, render_template, request
from flask_wtf import Form
from wtforms import SelectField, StringField, IntegerField
from wtforms.validators import DataRequired

ABS_DB_PATH = os.path.basename(__file__) + 'confuse.db'
db = Database()
app = Flask(__name__)
app.config['SECRET_KEY'] = 'confused'


class Tconfused(db.Entity):
    active = Required(bool, default=0)
    url = Optional(str)


class UpdateForm(Form):
    id = IntegerField('ID')
    active = SelectField('Active', choices=[(1, 'True'),
                                            (0, 'False')])
    url = StringField('URL', validators=[DataRequired('url needed.')])


@app.route('/')
@db_session
def index():
    records = Tconfused.select()[:]
    return render_template('index.html', records=records)


@app.route('/update/<int:id>', methods=('GET', 'POST'))
@db_session
def update(id):
    record = Tconfused.get(lambda p: p.id == id)

    form = UpdateForm()
    form.id.data = record.id
    form.active.data = record.active
    form.url.data = record.url

    if request.method == 'POST' and form.validate_on_submit():
        record.active = form.active.data
        record.url = form.url.data.strip()
        return redirect(url_for('index'))
    return render_template('update.html', record=record, form=form)


if __name__ == '__main__':
    db.bind('sqlite', ABS_DB_PATH, create_db=1)
    db.generate_mapping(create_tables=1)

    app.run(host='0.0.0.0', debug=1, port=5011)
index.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<div>
    <table>
        <thead>
            <tr>
                <td>edit</td>
                <td>id</td>
                <td>active</td>
                <td>url</td>
        </tr>
        </thead>
        <tbody>
        {% for record in records %}
            <tr>
                <td><a href="/update/{{ record.id }}">edit</a></td>
                <td>{{ record.id }}</td>
                <td>{{ record.active }}</td>
                <td>{{ record.url }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</div>
</body>
</html>

update.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<div>
    <form action="" method="post">
        {{ form.hidden_tag() }}
        <div>{{ form.id.label(disabled=True) }} {{ form.id.data }}</div>
        <div>{{ form.active.label }} {{ form.active() }}</div>
        <div>{{ form.url.label }} {{ form.url(size=50) }}</div>
        <div><input type="submit"></div>
    </form>
</div>
<br>

<div>
    <table>
        <thead>
        <tr>
            <td>id</td>
            <td>active</td>
            <td>url</td>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>{{ record.id }}</td>
            <td>{{ record.active }}</td>
            <td>{{ record.url }}</td>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>
3116 次点击
所在节点    Python
2 条回复
bjjvvv
2016-09-05 17:52:07 +08:00
form = UpdateForm()
form.id.data = record.id
form.active.data = record.active
form.url.data = record.url

这 4 句 POST 请求的时候同样会执行的,所以你把 POST 来的数据又赋值成原来的数据了
所以你要把这 4 句放到 if 块的下面
suueyoung
2016-09-05 21:11:11 +08:00
@bjjvvv 太感谢了. 搞定了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/304093

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX