Skip to main content
 首页 » 编程设计

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

2025年05月04日15lovecherry

我正在使用 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 文档中。