Python 未在HTML上选择SelectMultipleField默认值

Python 未在HTML上选择SelectMultipleField默认值,python,html,flask,wtforms,Python,Html,Flask,Wtforms,c、 IngRedients我正在创建一个用于学习的烧瓶示例应用程序,我有一个名为CocktailForm的表单,其中包含一个SelectMultipleField。此表单应用于创建新的鸡尾酒对象以及更新它们: class CocktailForm(Form): name = StringField('What is the coktail\'s name?', validators=[Required()]) ingredients = SelectMultipleField(

c、 IngRedients我正在创建一个用于学习的烧瓶示例应用程序,我有一个名为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'))
@main.route('/edit/',方法=['GET',POST'])
def编辑(id):
尝试:
c=cockbox.query.filter(cockbox.id==id.one()
form=CocktailForm()
form.components.choices=[(i.id,i.name)表示component.query.all()中的i
if form.validate_on_submit():
c、 name=form.name.data
鸡尾酒配料=配料.query.filter(配料.id.in(表单.配料.数据)).all()
c、 配料。扩展(鸡尾酒配料)
db.session.commit()
其他:
form.name.data=c.name
form.components.default=[(i.id,i.name)表示c.components中的i]
返回呈现模板('new.html',form=form)
除例外情况外,e:
打印e
返回重定向(url_用于('.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 %}
{%extends“base.html”%}
{%import“bootstrap/wtf.html”作为wtf%}
{%block title%}鸡尾酒{%endblock%}
{%block page_content%}
新鸡尾酒
{{wtf.quick_form(form)}
{%endblock%}
这是您可以在浏览器中看到的内容。我正在编辑由杜松子酒和补品组成的金顿鸡尾酒。但是,它们不会显示为选中状态:


提前感谢,任何提示都将受到欢迎

配料中i的行
form.contracents.default=[(i.id,i.name)。query.all()]
不设置所选值。您想将其更改为
form.contracents.data=[i.id for i in c.contracents]


您应该在验证块中有一个重定向/渲染模板,但这是可选的。

是的,您是对的,我以前有过这个模板,然后将其更改为测试。。但是,我仍然有一个问题,HTML上的内容没有正确地显示为选定内容,即使我添加了另一个成分,它也会检索默认内容和其他选定内容。默认内容接受ID列表
form.components.default=[i.id for i in component.query.all()]
应该可以工作。如果无法修复,请告诉我。我将在上午创建一些示例代码并进行测试。meNope现在是凌晨1点,我以前试过这个。当编辑鸡尾酒时,例如,含有两种成分的杜松子酒滋补品:杜松子酒和滋补品,它们看起来不像是被选中的。我添加了一张图片。很难解释,找到了。您不需要默认值。设置表单的默认值是
form.contracents.data=[i.id代表鸡尾酒中的i.contract.contracents]
。您可以设置数据属性。