【问题标题】:Populating forms and selecting defaults in Flask-WTF在 Flask-WTF 中填充表单并选择默认值
【发布时间】:2020-12-13 10:36:21
【问题描述】:

我有一个用于撰写和编辑这样的博客文章的表单:

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()

在与我的问题相关的other questions 周围钓鱼时,我发现我不能直接使用form.tags.data 突出显示关联的标签,因为这意味着该字段会忽略用户对表单的操作,即使选择正确将突出显示。这就是我使用form.tags.default 的原因。

form.tags.default 似乎可以突出显示正确的标签,但form.process() 会擦除由form = EditorForm(obj=post) 填写的所有其他字段。

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

【问题讨论】:

    标签: python flask flask-wtforms wtforms


    【解决方案1】:

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

    if form.validate_on_submit(): 上,我将form.tags.data(突出显示的选项)中的标签附加到我的post.tags。 在帖子已经附加标签的情况下,这意味着取消选择字段中的默认值确实会根据需要清空form.tags.data,但post.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)
    

    我还更改了填充表单的代码,使其更简单。我错了需要使用default 而不是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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多