在Flask微框架中使用WTForms的populate_obj()方法

9 投票
3 回答
17625 浏览
提问于 2025-04-16 18:44

我有一个模板,可以让用户编辑他们的个人信息。

<form method="post">
    <table>
        <tr>
            <td>Username:</td>
            <td>{{user['username']}}</td>
        </tr>
        <tr>
            <td>New Password:</td>
            <td> <input type="password" name="password"></td>
            <td>{% if form.password.errors %} {{form.password.errors}} {% endif %}<td>
        </tr>
        <tr>
            <td>Re-enter Password:</td>
            <td> <input type="password" name="confirm_password">
            </td>
        </tr>
        <input type='hidden' name='username' value="{{user['username']}}">
        <tr>
            <td><input type="submit" value="Submit"></td>
        </tr>
    </table>
</form>

我还写了一个视图函数,用来处理用户的这些编辑请求。我现在使用的数据库是MongoDB,并且用的是MongoKit这个模块。到目前为止,我在视图函数中只能做到这些,但没有成功。

def edit():
    username = request.args.get('user')
    user = User.find_one({'username':username}) # Is this a correct way of doing it?
    form = UserForm(**what should be placed here?**, obj=user)

    if request.method == 'POST' and form.validate():
        form.populate_obj(user)
        user.save()
        return 'updated'
    return render_template('edituser.html', form=form, user=user)

为了这个目的,我正在研究populate_obj(obj)这个方法。不过我在这方面找不到太多帮助。我该怎么做才能让populate_obj()正常工作呢?

3 个回答

2

在使用Flask-WTF的时候,你可以这样写

form = UserForm(obj=user)

这样就可以正常工作了!

6

你在用 Flask-WTF 吗?如果是的话,可以看看下面的示例代码:

https://github.com/sean-/flask-skeleton/blob/master/skeleton/modules/aaa/views.py#L13

具体来说,你需要:

def edit():
    form = UserForm()
    if form.validate_on_submit():
        # Commit your form data

总之,如果你在用 Flask-WTF,我不太确定你想问什么。如果你还没用 Flask-WTF,那就去用它吧。

17

UserForm 这个东西应该接收 request.form 里的内容,这样才能把 POST 请求中可用的值填充到表单里(如果有的话)。

form = UserForm(request.form, obj=user)

撰写回答