我可以在 __init__ wtforms 中添加字段吗
Can I add field in __init__ 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)
如果我这样做,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)
所以我的目标是制作一个 PurchaseForm
,它有一个 FieldList
包含 ItemForm
形式 class,将来我可以交换 ItemForm
不同的 class,例如 PurchaseItemForm
首先,我认为您的 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)
出于某种原因,我需要在 __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)
如果我这样做,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)
所以我的目标是制作一个 PurchaseForm
,它有一个 FieldList
包含 ItemForm
形式 class,将来我可以交换 ItemForm
不同的 class,例如 PurchaseItemForm
首先,我认为您的 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)