我正在使用 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 %}
但是所有年份的主题都不一样,所以我想动态地列出主题字段列表,以便仅建议与所选年份对应的主题。知道我该怎么做吗?
请您参考如下方法:
您可以在您的 View 中通过分配后构造来自定义选择值:
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() 之前设置好选项,就可以开始了。
有关引用,请参阅 SelectField from Dynamic Choices在 WTForms 文档中。
