【问题标题】:SelectMultipleField default value is not being selected on HTML在 HTML 上未选择 SelectMultipleField 默认值
【发布时间】:2016-03-03 11:57:24
【问题描述】:

c.ingredients我正在创建一个用于学习目的的 Flask 示例应用程序,并且我有一个名为 CocktailForm 的表单,其中包含一个 SelectMultipleField。此表单应用于创建新的鸡尾酒对象以及更新它们:

class CocktailForm(Form):
    name = StringField('What is the coktail\'s name?', validators=[Required()])
    ingredients = SelectMultipleField('Ingredients',
                                      coerce=int,
                                      )
    submit = SubmitField('Submit')

为了进行编辑,我想使用鸡尾酒数据加载相同的表单。它适用于名称和加载所有选项,但我还想选择那些作为鸡尾酒成分的选项:

@main.route('/edit/<int:id>', methods=['GET', 'POST'])
def edit(id):

    try:
        c = Cocktail.query.filter(Cocktail.id == id).one()
        form = CocktailForm()
        form.ingredients.choices = [(i.id, i.name) for i in Ingredient.query.all()]

        if form.validate_on_submit():
            c.name = form.name.data
            cocktail_ingredients = Ingredient.query.filter(Ingredient.id.in_(form.ingredients.data)).all()
            c.ingredients.extend(cocktail_ingredients)
            db.session.commit()
        else:
            form.name.data = c.name
            form.ingredients.default = [(i.id, i.name) for i in c.ingredients]
            return render_template('new.html', form=form)

    except Exception, e:
        print e

    return redirect(url_for('.index'))

我得到了意想不到的结果,因为在 HTML 上没有显示这些选项,但是当我提交表单时,即使您选择了新选项,这些选项似乎也总是被选中。

模板很简单:

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Cocktails{% endblock %}

{% block page_content %}
<div class="page-header">

    <h1>New Cocktail</h1>
    {{ wtf.quick_form(form) }}

</div>
{% endblock %}

这是您可以在浏览器中看到的内容。我正在编辑由杜松子酒和滋补品组成的 Gintonic 鸡尾酒。但是它们不会显示为选中状态:

Browser

提前感谢,任何提示将不胜感激

【问题讨论】:

    标签: python html flask wtforms


    【解决方案1】:

    form.ingredients.default = [(i.id, i.name) for i in Ingredient.query.all()] 行未设置所选值。你想把它改成form.ingredients.data = [i.id for i in c.ingredients]

    您应该在验证块中有一个 redirect/render_template,但这是可选的。

    【讨论】:

    • 是的,你是对的,我之前有这个,然后为了测试而改变了它。但是,我仍然有一个问题,即 HTML 没有正确显示为选中状态,即使我添加了另一种成分检索默认的那些以及选择的其他成分
    • 默认接受 id 列表。 form.ingredients.default = [i.id for i in Ingredient.query.all()] 应该可以工作。让我知道它是否无法解决。我将在早上创建一些示例代码并进行测试。我现在是凌晨 1 点
    • 不,我以前试过这个。编辑鸡尾酒时,例如具有两种成分的 Gin Tonic:Gin 和 Tonic,它们看起来不像被选中
    • 我添加了一张图片。很难解释。
    • 找到了。您不需要默认值。为表单设置默认值是form.ingredients.data = [i.id for i in cocktail.ingredients] 。您设置数据属性。
    猜你喜欢
    • 2018-07-24
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多