我可以在__init__ wtforms中添加字段吗?

and*_*win 7 python wtforms flask-wtforms

由于某种原因,我需要在里面声明一个字段,__init__()所以我可以制作任意类型的FormField.

举个例子form.py:

class PurchaseForm(Form):
    item_class = ItemForm
    transaction_items = FieldList(FormField(item_class),
                                  label='items',
                                  min_entries=1)

    def __init__(self, item_class, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.item_class = item_class
       self.transaction_items = FieldList(FormField(self.item_class),
                                           label='items',
                                           min_entries=1)
Run Code Online (Sandbox Code Playgroud)

如果我这样做,该transaction_items字段不会被替换__init__(),我可以做一些事情来覆盖它吗?或者setattr为这个特定的例子做些什么?


编辑:这是我如何指定构造函数

import form

@app.route('/add/purchase-transaction', methods=['GET', 'POST'])
def add_purchase_transaction():
    form = forms.PurchaseForm(form.ItemForm)

    if form.validate_on_submit():
        # do something

    return render_template('add-purchase-transaction.html', form=form)
Run Code Online (Sandbox Code Playgroud)

所以我的目标是做一个PurchaseForm具有FieldList包含ItemForm窗体类,并在将来,我可以换ItemForm到不同的类,例如PurchaseItemForm

wil*_*lfo 5

首先,我认为您super().__init__(*args, **kwargs)的无效应该是super(PurchaseForm, self).__init__(*args, **kwargs)- 我们能够像这样运行您的代码吗?

另外,你怎么能告诉它不工作 - 从这段代码中查看一个创建的表单 - 看起来不错:

class ItemForm(Form):
    openid = StringField('openid', validators=[])
    remember_me = BooleanField('remember_me', default=False)

class PurchaseForm(Form):
    item_class = ItemForm
    transaction_items = None

    def __init__(self, item_class, *args, **kwargs):
        super(PurchaseForm, self).__init__(*args, **kwargs)
        self.item_class = item_class
        self.transaction_items = FieldList(FormField(self.item_class),
                                           label='items',
                                           min_entries=1)
Run Code Online (Sandbox Code Playgroud)