【问题标题】:Dynamically generate flask-wtf form动态生成flask-wtf形式
【发布时间】:2018-12-06 16:18:54
【问题描述】:

我必须制作很多 RadioField,我认为动态生成它们会很好,但我无法让代码正常工作。我正在使用 Flask 和 flask-wtf。

表格定义:

from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField

class GenerateForm(FlaskForm):
    def binary_generator(self, label_text, yes_text, no_text):
        return RadioField(label_text, choices=[(1, yes_text), (0, no_text)])

    submit = SubmitField('submit')

Flask 应用:

import GeneratorForm

form = GeneratorForm
form.radio_one = form.binary_generator('test label', 'yes', 'no')

render_template('file.html', form=form)

神社:

{{ form.radio_one.label }}
{{ form.radio_one(style="list-style: none") }}

Jinja 失败:wtforms.fields.core.UnboundField object has no attribute label

所以看起来类 binary_generator 函数工作正常,但没有正确构造表单?

【问题讨论】:

    标签: flask flask-wtforms wtforms


    【解决方案1】:

    基类FlaskForm 对其构造非常讲究。要定义动态表单,请在使用super() 实例化基类之后添加参数。即

    class GenerateForm(FlaskForm):
        radio_fields = RadioField('', choices=[])
        submit = SubmitField('submit')
    
        def __init__(self, label, choices):
            super().__init__()
            self.radio_fields.choices = label
            self.radio_fields.choices = choices
    

    然后您可以使用以下方法实例化表单:

    GenerateForm('My Label', [('val', 'desc'), ('val2', 'desc2')])]
    

    您还可以通过以下方式创建表单工厂:

    def Form(n, *args):
        class FormGenerator(FlaskForm):
            submit = SubmitField('submit')
    
        for i in range(n):
            setattr(FormGenerator, RadioField(args[i][0], choices=args[i][1])
    
        return FormGenerator()
    

    然后您可以使用以下方法实例化表单:

    Form(2, *(('rad1', [('v1', 'd1'), ('v2', 'd2')]), ('rad2', [('v1', 'd1'), ('v2', 'd2')])))
    

    【讨论】:

      【解决方案2】:

      您需要GenerateForm 中的binary_generator 方法吗?

      您的 GenerateForm 可能如下所示:

      from flask_wtf import FlaskForm
      from wtforms import RadioField, SubmitField
      
      class GenerateForm(FlaskForm):
          radio_fields = RadioField('', choices=[])
          submit = SubmitField('submit')
      

      在你的烧瓶应用程序中,你需要像这样实例化你的表单:

      import GeneratorForm
      
      form = GeneratorForm() # Instantiate it
      
      form.radio_fields.label = 'Label Example'
      form.radio_fields.choices = [('value_1', 'description'), ('value_2', 'description')] 
      
      render_template('file.html', form=form)
      

      file.html 中呈现您的表单:

      <form method="post">
          {{ form.hidden_tag() }}
          {{ form.radio_fields.label }}
          {{ form.radio_fields(style='list-style: none') }}
          {{ form.submit }}
      </form>
      

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-16
        • 2015-05-18
        • 2016-11-19
        相关资源
        最近更新 更多