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

con*_*mer 7 python flask mongokit wtforms

我有一个模板,允许用户编辑他们的用户信息.

<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>
Run Code Online (Sandbox Code Playgroud)

我还有一个用于处理用户编辑的视图功能.我目前使用的数据库是带有MongoKit模块的MongoDB.到目前为止,我只能在视图功能中做到这一点,但没有运气.

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)
Run Code Online (Sandbox Code Playgroud)

我为此目的通过populate_obj(obj).我在这件事上找不到多少帮助.为了populate_obj()工作,我该怎么办?

Sea*_*ira 15

UserForm应该已经request.form传入它以使用POST请求中可用的值(如果有)填充它.

form = UserForm(request.form, obj=user)
Run Code Online (Sandbox Code Playgroud)

  • 只有原生的`WTForms`.使用`Flask-WTF`不需要额外的`request.form`. (9认同)
  • @Sean - 真......这是为什么`Flask-WTF`是一个很好的扩展的一部分; 它有助于削减样板.但OP并没有使用`Flask-WTF`,所以简单地建议他使用它有点类似于建议使用jQuery来解决JavaScript问题.这意味着你的问题已经解决了 - 但问题已经解决了******你...**你**仍然不知道如何解决它.这就是为什么我只是以一种简单的方式让OP使用Flask和WTForms来做他需要的东西(你已经非常好地指出了'Flask-WTF`的优点而且我给了你一个+1; - )). (5认同)

Sea*_*ean 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
Run Code Online (Sandbox Code Playgroud)

最重要的是,如果你正在使用Flask-WTF,我不确定你的问题是什么.如果您不使用Flask-WTF,请使用Flask-WTF.