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)

フォーム、オブジェクト データ、およびキーワード引数の入力を取得し、フィールドにそれらを処理させます。

パラメーター:

  • formdata – エンドユーザーからのデータを渡すために使用されます。通常は request.POST または同等のものです。
  • obj – formdata にフィールドのデータがない場合、フォームは渡されたオブジェクトからデータを取得しようとします。
  • **kwargs – formdata または obj のいずれにもフィールドの値が含まれていない場合、フォームは一致するキーワード引数の値をフィールドに割り当てます (提供されている場合)。

BaseForm はインスタンス化時にデータを取得しないため、これを呼び出して、囲まれたフィールドにフォーム データを提供する必要があります。プロセスを呼び出す前にフィールドのデータにアクセスすることはお勧めしません。

于 2016-03-09T13:13:43.647 に答える