为了账号安全,请及时绑定邮箱和手机立即绑定

在 Flask-WTF 中填充表单和选择默认值

在 Flask-WTF 中填充表单和选择默认值

qq_遁去的一_1 2023-06-20 13:34:23
我有一个用于撰写和编辑博客文章的表单,如下所示:class EditorForm(FlaskForm):    title = StringField('Title', validators=[DataRequired(), Length(min=1, max=250)])    body = PageDownField('Body', validators=[DataRequired()])    tags = SelectMultipleField('Tags', coerce=int)    timestamp = DateTimeField('Timestamp')    published = BooleanField('Publish?')    update = BooleanField('Update Timestamp?')    delete = SubmitField('Delete')    submit = SubmitField('Save')在我看来,我区分编辑现有帖子和创建新帖子。对于现有的帖子,如果它们有关联的标签,我希望它们在表单中突出显示,SelectMultipleField以便用户可以看到它们。如果这些被突出显示并且我想删除标签,我需要能够取消突出显示它们并提交表单来这样做。以下是我目前观点的相关部分:@app.route('/editor/<slug>', methods=['GET', 'POST'])@app.route('/editor/', methods=['GET', 'POST'])@login_requireddef editor(slug=None):    # old post or new post?    if slug:        post = Post.query.filter_by(slug=slug).first()    else:        post = Post()    # populate form, blank for new post    form = EditorForm(obj=post)        # populate tags field    form.tags.choices = [(tag.id, tag.tag) for tag in Tag.query.order_by('tag')]    # declare list for tag highlights on GET    if request.method == 'GET':        form.tags.default = []    # if post has linked tags, highlight them    if post.tags:        for tag in post.tags:            if tag.id not in form.tags.default:                form.tags.default.append(tag.id)        form.process()在解决与我的问题相关的其他问题时,我发现我不能直接使用form.tags.data来突出显示关联的标签,因为这意味着该字段将忽略用户在表单上的操作,即使正确的选择将被突出显示。这就是我使用form.tags.default.form.tags.default似乎可以突出显示正确的标签,但form.process()会擦除由填写的所有其他字段form = EditorForm(obj=post)。所以我的问题是:如何使用现有的帖子数据填充我的表单并在同一实例中突出显示正确的标签?
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

我似乎已经通过这个问题获得了我想要的结果。我原来的问题的一部分实际上与我没有在我的问题中发布的视图中的一些代码有关。


在 上,我将(突出显示的选项)if form.validate_on_submit():中的标签附加到我的. 在帖子已经附加标签的情况下,这意味着取消选择字段中的默认值确实会根据需要清空,但无论如何仍然有原始数据,因此没有变化。form.tags.datapost.tagsform.tags.datapost.tags


这是通过以下方式解决的:


# empty tags list then add highlighted choices

    post.tags = []

    for id in form.tags.data:

        t = Tag.query.filter_by(id=id).first()

        post.tags.append(t)

我还更改了填充表单的代码,使其更简单。我错了需要使用defaultover data(坦率地说,我不明白两者之间的区别):


    # populate form, blank for new post

    form = EditorForm(obj=post)

    # populate tags field

    form.tags.choices = [(tag.id, tag.tag) for tag in Tag.query.order_by('tag')]

    # populate defaults only on GET otherwise user choice overidden

    if request.method == 'GET':

        # declare default (highlighted) tags list

        form.tags.data = []

        # if post has tags, highlight them

        if post.tags:

            for tag in post.tags:

                form.tags.data.append(tag.id)


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信