如何为 WTForms 中的 StringField 提供默认值

How can I give a default value for the StringField in WTForms

我有这个class:

class New_video_form(FlaskForm):
    title = StringField('title', validators=[DataRequired()])
    genre = StringField('genre', validators=[DataRequired()])
    link = StringField('link', validators=[DataRequired()])
    image = StringField('Image', validators=[DataRequired()])
    description = StringField('description', validators=[DataRequired()])

我在这里实现了这个:

<h1 style="color: white; text-align: center; margin-top: 20px;">Editing the movie: {{ video.title }}</h1>
<form action="" method="POST" style="display: flex; flex-direction: column; align-items: center; justify-content: center; margin-top: 50px;">
    {{ form.csrf_token }}
    <div class="form-group">
        {{ form.title(class="form-control", value="{{ video.title}}", placeholder="Title") }}
    </div>
    <div class="form-group">
        {{ form.genre(class="form-control", value="{{ video.genre }}", placeholder="Genre") }}
    </div>
    <div class="form-group">
        {{ form.link(class="form-control", value="{{ video.link }}", placeholder="Video Link") }}
    </div>
    <div class="form-group">
        {{ form.image(class="form-control", value="{{ video.image}}", placeholder="Image") }}
    </div>
    <div class="form-group">
        {{ form.description(class="form-control", value="{{ video.description }}", placeholder="Description") }}
    </div>
    <button type="submit" class="btn btn-light btn-lg">Send</button>
</form>

并且此表格是从这条路线发送的:

@controller.route('/edit/<int:id>/', methods=['GET','POST'])
def edit(id):
    if current_user.is_authenticated:
        form = New_video_form()
        video = Video.query.filter_by(id=id).first()
        if request.method == "POST":
            video.title = form.title.data
            video.link = form.link.data
            video.image = form.image.data
            video.genre = form.genre.data
            video.description = form.description.data
            db.session.commit()
            #add a flash message
            return redirect(url_for('index'))
        else:
            return render_template('edit.html',form=form, video=video)
    else: 
        return redirect(url_for('controller.admin'))

我在这里发送表单和将在表单中使用的数据作为视频,但是当我将数据放入值字段时,表单呈现 {{ video.example }} 而不是值。 我如何为 stringfield 从 {{ video.example }} 获取值并呈现该值?

ps:h1 呈现正确的值。

如果我没理解错的话,如果用户来编辑视频,你想显示预填的表格吗?

您可以使用 this API 并在初始化时将视频对象传递给表单,如下所示:

video = Video.query.filter_by(id=id).first()
form = New_video_form(obj=video)

如果这样做,则不需要为每个字段显式传递 value="{{video.title}}" 等等。

快速编辑:刚刚注意到您在 db.session.commit() 之前还缺少 db.session.add(video) — 除非您将更新的对象添加到会话中,否则不会提交更改。