【问题标题】:Can I add field in __init__ wtforms我可以在 __init__ wtforms 中添加字段吗
【发布时间】:2016-02-14 03:28:08
【问题描述】:

出于某种原因,我需要在 __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,它有一个包含ItemForm 表单类的FieldList,将来我可以将ItemForm 交换到不同的类,例如PurchaseItemForm

【问题讨论】:

  • 您应该重新阅读解释删除类属性时会发生什么的部分。目前它没有意义。
  • 是的,谢谢,已经改了
  • 您能否指定初始化实例的方式以及transaction_labelself.transaction_label 的定义位置?
  • 编辑了答案,它在那里,我如何指定实例构造函数。关于transaction_label,它类似于transaction_items 的行为方式,现在我只是将其删除以避免重复
  • Wilfo 是绝对正确的,因为 Form 是一个元类。我刚刚加入了stackoverflow,询问andiwinta他们是否可以发布他们的新PurchaseFOrm(BaseForm)。尝试使用 super().__init__() 并尝试扩展 Form 类时,我遇到了同样的问题。非常感谢。

标签: python wtforms flask-wtforms


【解决方案1】:

首先,我认为您的 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)

【讨论】:

  • 我认为super().__init__() 对 Python 3 有效。我按照您的示例进行操作,但它仍然是一样的,编译正常但 jinja2 抛出错误(抱歉,现在只提一下)。所以jinja2的错误是TypeError: 'UnboundField' object is not iterable,它来自{% for item in form.transaction_items %}
  • 查看对此question 的回复 - 从WTForms 的角度来看,您尝试做的似乎不是一个好习惯
  • 啊,我明白它是如何工作的。然后,我将其拆分为每种类型的表单。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多