我正在使用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 %}
但是这些年来的主题并不相同,所以我想使主题领域的列表动态化,以便仅提出与所选年份相对应的主题。知道我该怎么做吗?
答案 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。