WTForms,有多个SelectField吗? SelectFieldArray存在吗?

时间:2014-02-10 12:59:30

标签: python flask wtforms

我正在努力寻找更好的解决方案。我的解决方案现在非常笨拙(但是很有效),因为如果我想要20个选择领域......你可以想象模板看起来有多么可怕和长久等等...... 所以基本上我要问的是,如果WTForm中存在一些SelectFieldArray对象?我没有在文档中找到。
所以这是我现在的尴尬解决方案:
在我的视图方法中,我这样做:

form = ResultForm()

if form.validate_on_submit():
    print form.f1.data
    print form.f2.data

我的模板:

{% extends "base.html" %}
{% block body %} 
<form method="post">
    {{ form.hidden_tag() }}
    <p>
        <label for="title">
            {{form.f1.label}}
        </label><br/>
        {{form.f1}}
         <label for="title">
            {{form.f2.label}}
        </label><br/>
        {{form.f2}}

        {% if form.f1.errors %}
            <ul class="errors">
                {% for error in form.f1.errors %}
                <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        {% if form.f2.errors %}
            <ul class="errors">
                {% for error in form.f1.errors %}
                <li>{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
    </p>
    <input type="submit" value="Go">
</form>
{% endblock %}

我的WTForm课程:

from flask.ext.wtf import Form
from wtforms import TextField, PasswordField,SelectField,validators
from wtforms.validators import Required
class ResultForm(Form):
f1 = SelectField(u'f1',
            coerce=int,
            validators=[validators.optional()],
            choices=[(1, 'A'),(2, 'B'),(3, 'C'),(4, 'D'),(5, 'E'),(6, 'FX'),(7, 'na')])
f2 = SelectField(u'f2',
            coerce=int,
            validators=[validators.optional()],
            choices=[(1, 'A'),(2, 'B'),(3, 'C'),(4, 'D'),(5, 'E'),(6, 'FX'),(7, 'na')])

2 个答案:

答案 0 :(得分:0)

要重复一个字段,您可以使用wtforms.fields.FieldList(请参阅有关Field Closures的文档):

class ResultForm2(BaseForm):
    selects = FieldList(SelectField(u'Select', coerce=int,
                                    validators=[validators.optional()],
                                    choices=[(1, 'A'), (2, 'B'), (3, 'C'),
                                             (4, 'D'), (5, 'E'), (6, 'FX'),
                                             (7, 'na')]), min_entries=2)

产生两个名为“select-0”和“choices-1”的选择输入(因为min_entries设置为2)。两者都有相同的数据。

您还可以动态创建表单(请参阅有关Dynamic Form Composition的文档),例如:

def my_dynamic_form(select_field_count=20):
    class F(MyBaseForm):
        pass
    for i in range(select_field_count):
        setattr(F, 'f%d' % i, SelectField('F%d' % i, coerce=int,
                                        validators=[validators.optional()],
                                        choices=[(1, 'A'), (2, 'B'), (3, 'C'),
                                                 (4, 'D'), (5, 'E'), (6, 'FX'),
                                                 (7, 'na')]))
    return F

这样,表单可以完全动态构建,例如SelectFields可以有不同的选择。

答案 1 :(得分:0)

@oliverdm  我甚至不能在没有50名声明的情况下评论你的回应... n / c

我试图做的是:

<form action="">
<select name="" id=""></select>
<select name="" id=""></select>
<select name="" id=""></select>
<select name="" id=""></select>
<select name="" id=""></select>
<select name="" id=""></select>
 </form>

没有这样做......

class ResultForm(Form):
  f1 = SelectField(u'f1',...
  f2 = SelectField(u'f2',...
  f3 = SelectField(u'f3',...
  f4 = SelectField(u'f4',...
  f5 = SelectField(u'f5',...

然后使用view方法执行类似form [i] .data ...或某事.... 这是你的代码示例吗?