2

我正在使用 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 %} 

但是所有年份的科目都不一样,所以我想动态列出科目字段的列表,以便只提出与所选年份对应的科目。知道我该怎么做吗?

4

1 回答 1

7

您可以通过在视图中的构造后赋值来自定义选择值:

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 文档中Dynamic Choices 中的 SelectField 。

于 2013-09-17T19:50:03.003 回答