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

我有一个用于撰写和编辑博客文章的表单,如下所示:


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_required

def 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)。


所以我的问题是:如何使用现有的帖子数据填充我的表单并在同一实例中突出显示正确的标签?


qq_遁去的一_1
浏览 160回答 1
1回答

蝴蝶刀刀

我似乎已经通过这个问题获得了我想要的结果。我原来的问题的一部分实际上与我没有在我的问题中发布的视图中的一些代码有关。在 上,我将(突出显示的选项)if form.validate_on_submit():中的标签附加到我的. 在帖子已经附加标签的情况下,这意味着取消选择字段中的默认值确实会根据需要清空,但无论如何仍然有原始数据,因此没有变化。form.tags.datapost.tagsform.tags.datapost.tags这是通过以下方式解决的:# empty tags list then add highlighted choices&nbsp; &nbsp; post.tags = []&nbsp; &nbsp; for id in form.tags.data:&nbsp; &nbsp; &nbsp; &nbsp; t = Tag.query.filter_by(id=id).first()&nbsp; &nbsp; &nbsp; &nbsp; post.tags.append(t)我还更改了填充表单的代码,使其更简单。我错了需要使用defaultover data(坦率地说,我不明白两者之间的区别):&nbsp; &nbsp; # populate form, blank for new post&nbsp; &nbsp; form = EditorForm(obj=post)&nbsp; &nbsp; # populate tags field&nbsp; &nbsp; form.tags.choices = [(tag.id, tag.tag) for tag in Tag.query.order_by('tag')]&nbsp; &nbsp; # populate defaults only on GET otherwise user choice overidden&nbsp; &nbsp; if request.method == 'GET':&nbsp; &nbsp; &nbsp; &nbsp; # declare default (highlighted) tags list&nbsp; &nbsp; &nbsp; &nbsp; form.tags.data = []&nbsp; &nbsp; &nbsp; &nbsp; # if post has tags, highlight them&nbsp; &nbsp; &nbsp; &nbsp; if post.tags:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for tag in post.tags:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; form.tags.data.append(tag.id)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python