10

我可以使用 WTForms 和 Flask 向我的数据库添加一个新条目,我也可以编辑,问题是我需要在编辑表单中显示数据库中已经存在的信息。

我有以下代码:

编辑帖子表单的类

class editPostForm(Form):
    postTitle = TextField('postTitle', validators.Required()])
    postSubtitle = TextField('postSubtitle', validators.Required()])

编辑帖子模板的路线

@app.route('/editpost/<postId>', methods = ['GET','POST'])
def editpost_page(postId):
try:
    form = editPostForm(form)

    if request.method == "POST" and form.validate():
        postTitle = form.postTitle.data
        postSubtitle = form.postSubtitle.data

        c, conn = connection()

        query = c.execute("SELECT * FROM posts WHERE post_id = (%s)",
                          [noinjection(postId)])

        c.execute("UPDATE posts SET post_title=%s, post_subtitle=%s WHERE post_id = %s",
                     [
                     noinjection(postTitle),
                     noinjection(postSubtitle),
                     noinjection(postId)
                     ])

        conn.commit()

        flash("Post Edited", 'success')

        c.close()
        conn.close()
        gc.collect()

        return redirect(url_for('posts'))

    return render_template("editpost.html", form = form, POST_ID = postId)

except Exception as e:
    return(str(e))

编辑帖子模板 {jinja}

{% extends "header.html" %}

{% block body %}

<body>
    <div class="container-fluid">
        <br />
        <h4>Edit Post</h4>
        <br />
        {% from "_formhelpers.html" import render_field %}
        <form action="/editpost/{{ POST_ID }}" class="form-horizontal" method="post">
            {% from "_formhelpers.html" import render_field %}
            <form action="/editpost/" method="post">
              <div class="form-group">
                <label for="postTitle">Post Title</label>
                <input type="text" class="form-control" id="postTitle" name="postTitle" placeholder="Post Title" value="{{request.form.postTitle}}">
              </div>
              <div class="form-group">
                <label for="postSubtitle">Post Subtitle</label>
                <input type="text" class="form-control" id="postSubtitle" name="postSubtitle" placeholder="Post Subtitle" value="{{request.form.postSubtitle}}">
              </div>
              <button type="submit" class="btn btn-default">Submit</button>
            </form>
            {% if error %}
                <p class="error"><strong>Error: </strong>{{error}}</p>
            {% endif %}
        </form>
        {% if error %}
            <p class="error"><strong>Error: </strong>{{error}}</p>
        {% endif %}

    </div>
</body>

{% endblock %}

使用以下代码,我在数据库中获取要更新的选定帖子,但 editpost 模板未显示数据库中已有的值,并且所有字段均为空白。

如何在编辑之前预填充表单?

4

2 回答 2

20

您可以像这样分别填充每个字段:

form = editPostForm(form)
form.postTitle.data = postTitle_from_database
form.postSubtitle.data = postSubtitle_from_database

或者您可以使用process以下方法从给定对象填充表单字段:

process(formdata=None, obj=None, **kwargs)

获取表单、对象数据和关键字 arg 输入,并让字段处理它们。

参数:

  • formdata – 用于传递来自最终用户的数据,通常是 request.POST 或等效的。
  • obj - 如果 formdata 没有字段数据,则表单将尝试从传递的对象中获取它。
  • **kwargs – 如果 formdata 或 obj 都不包含某个字段的值,则表单会将匹配的关键字参数的值分配给该字段(如果提供)。

由于 BaseForm 在实例化时不获取其数据,因此您必须调用它以向封闭的字段提供表单数据。不建议在调用进程之前访问该字段的数据。

于 2016-03-09T13:13:43.647 回答
6

我能够使用 Python 和 Jinja 从 SQL 数据库中预填充 HTMLinputtextarea字段,如下所示:

1.将数据库中的相关数据存储在一个变量中:

    name = db.execute("""SELECT name FROM users WHERE id = :id""", id=session["user_id"])

    about = db.execute("""SELECT about FROM users WHERE id = :id""", id=session["user_id"])

2.渲染模板(带有render_template函数)并传入相关变量:

return render_template("edit.html", name = name, about = about)

3. 通过 jinja 将变量传递给 htmlinputtextarea元素。对已传递的对象的索引如下:

对于input标签,使用如下的 value 属性:

    <input type="text" class="form-control" name="name" value="{{ name[0]["name"] }}">

对于一个textarea元素:

    <textarea class="form-control" name="about">{{ about[0]["about"] }}</textarea> 
于 2017-06-10T20:50:49.087 回答