动态字段取决于WTForms的先前字段

时间:2013-09-11 09:20:28

标签: python flask wtforms

我正在使用WTForms制作表格。目前,我有这个:

class UploadForm(flask_wtf.Form):
    fichier = wtforms.fields.FileField(u'Fichier')
    description = wtforms.fields.TextAreaField(u'Description')
    year = wtforms.fields.SelectField(u'Année', choices=[('1A','1A'),('2A','2A')])
    subject = wtforms.fields.SelectField(u'Matière', choices=app.config['SUBJECTS'])
    submit = wtforms.fields.SubmitField(u'Envoyer')

使用SUBJECTS = [('Sub1','Sub1'), ('Sub2','Sub2')]和此模板:

{% block content %}
  <h2>Form</h2>
  <form action="{{ url_for('get') }}" method="post"
          enctype="multipart/form-data">
    {{ form.hidden_tag() }}

    {{ form.fichier.label }}
    {{ form.fichier }}

    {{ form.description.label }}
    {{ form.description }}

    {{ form.year.label }}
    {{ form.year }}

    {{ form.subject.label }}
    {{ form.subject }}

    {{ form.submit }}
  </form>
{% endblock %} 

但是这些年来的主题并不相同,所以我想使主题领域的列表动态化,以便仅提出与所选年份相对应的主题。知道我该怎么做吗?

1 个答案:

答案 0 :(得分:6)

您可以在视图中按照构建后的分配自定义选项值:

def view():
    form = UploadForm(request.form, ...)
    if form.year.data == '1A':
        form.subject.choices = SUBJECTS_1A
    else:
        form.subject.choices = SUBJECTS_2A

    if request.form and form.validate():
       [...]

当然,使用dicts作为查找映射更加pythonic。

SUBJECTS_BY_YEAR = {
    '1A': [('a', 'a'), ('b', 'b')],
    '2A': [...],
}

def view():
    form = UploadForm(request.form)
    form.subject.choices = SUBJECTS_BY_YEAR.get(form.year.data) or []

只要在调用validate()之前设置了选项,那么你就可以了。

有关参考,请参阅WTForms文档中的SelectField from Dynamic Choices