【问题标题】:FlaskForm wtforms multiple input fields single submitFlaskForm wtforms 多个输入字段单次提交
【发布时间】:2018-02-05 04:32:17
【问题描述】:

使用 FlaskForm 和 SelectMultipleField,我正在创建一个选择表,允许对多项选择进行排名:1、2、3、...。

为了将选项以网格模式放置在表格中,我将每一行设为自己的 SelectMultipleField 实例。

提交按钮只返回 SelectMultipleField (dogs) 的第一个实例的值。

如何让提交按钮返回 SelectMultipleField 的所有实例中的值?

这是我的表单模块中的类:

class LPRForm(FlaskForm):
    party = ['Dogs', 'Cats', 'Rabbits', 'Birds']
    dog = [('', 'D. Duke'), ('', 'R. Rusty'), \
             ('', 'T. Tucker'), ('', 'R. Roger')]
    cat = [('', 'S. Shadow'), ('', 'M. Misty'), \
             ('', 'P. Patch'), ('', 'P. Paws')]
    rabbit = [('', ''), ('', 'C. Clover'), ('', ''), ('', '')]
    bird = [('', 'P. Pikachu'), ('', 'S. Starburst'), \
              ('', ''), ('', 'F. Flighty')]

    vote_dog = SelectMultipleField('District', choices=dog, 
                        option_widget=widgets.TextInput() )
    vote_cat = SelectMultipleField('District', choices=cat, 
                        option_widget=widgets.TextInput() )
    vote_rabbit = SelectMultipleField('District', choices=rabbit, 
                        option_widget=widgets.TextInput() )
    vote_bird = SelectMultipleField('District', choices=bird, 
                        option_widget=widgets.TextInput() )

    submit = SubmitField('Cast Ballot')

这是html文件的相关部分:

<table style="width:100%" align="center">
    <tr>
    <td>  </td>
    {% for vote in form.vote_dog %}
        {% if vote.label != '': %}
            <td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>

        {% endif %}
    {% endfor %}
    </tr>

    <tr>
    <td>  </td>
    {% for vote in form.vote_cat %}
        {% if vote.label != '': %}
            <td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>

        {% endif %}
    {% endfor %}
    </tr>

    <tr>
    <td>  </td>
    {% for vote in form.vote_rabbit %}
        {% if vote.label != '': %}
            <td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>

        {% endif %}
    {% endfor %}
    </tr>

    <tr>
    <td>  </td>
    {% for vote in form.vote_bird %}
        {% if vote.label != '': %}
            <td>{{ vote(size="2") }}</td> <td>{{ vote.label }}</td>

        {% endif %}
    {% endfor %}
    </tr>
</table>
</td>
</tr>

{{ form.submit }}

还有视图模块:

@app.route('/lpr', methods=['GET', 'POST'])
def lpr():
    form = LPRForm() 
    return render_template('lpr.html', title='Home', form=form)

【问题讨论】:

  • 你的 html 模板有没有表单标签? lpr() 也需要 form = LPRForm(request.POST) 或类似的,否则你总是在处理一个没有提交用户数据的新表单(GET 方法的表单)。
  • @progmatico 我的模板没有表单标签。我正在使用form=LPRForm(),浏览器正在将用户数据提交回服务器。 request.POST的目的是什么?
  • 嗯...您的代码没问题。我建议使用瓶子和 WTForms 的常用模式。看起来 Flask 有细微的差别,模式不适用。 request.POST 给你一个瓶中的MultiDict,然后你用它作为表单对象属性的模板来实例化表单(在发布操作之后,字段将被填充)。我认为从 Flask 文档中没有 request.POST,并且看起来不需要这种方式。可能request.form 给出了同样的结果。

标签: python flask flask-wtforms


【解决方案1】:

我能够通过使用 FormField 来完成这项工作。但是,文档提供了一个默认分隔符 -。此外,我明确标识了separator='-',但只有当我使用. 作为分隔符时,在调用类时,它才能正常工作,......即使使用separator='-'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多