【问题标题】:Dynamic fields depending of previous fields with WTForms动态字段取决于使用 WTForms 的先前字段
【发布时间】:2013-09-11 09:20:28
【问题描述】:

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

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

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      相关资源
      最近更新 更多