2

wtforms のデフォルト フィールド クラスからサブクラスを作成しようとしています。

class MyForm(Form):
    fieldName = MyField('field name')

MyField は別のファイルからインポートされます

class MyField(TextField):
    def __init__(self):
        super(MyField, self).__init__(**kwargs)

ただし、ここで作成した MyForm を作成すると、いくつかのエラーが発生します。

In [5]: f = MyForm()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
path/<ipython-input-5-decc3699f7c4> in <module>()
----> 1 f = RegistrationForm()

path/wtforms/form.pyc in __call__(cls, *args, **kwargs)
    176             fields.sort(key=lambda x: (x[1].creation_counter, x[0]))
    177             cls._unbound_fields = fields
--> 178         return type.__call__(cls, *args, **kwargs)
    179 
    180     def __setattr__(cls, name, value):

path/wtforms/form.pyc in __init__(self, formdata, obj, prefix, **kwargs)
    222             of a matching keyword argument to the field, if one exists.
    223         """
--> 224         super(Form, self).__init__(self._unbound_fields, prefix=prefix)
    225 
    226         for name, field in iteritems(self._fields):

pathwtforms/form.pyc in __init__(self, fields, prefix)
     37 
     38         for name, unbound_field in fields:
---> 39             field = unbound_field.bind(form=self, name=name, prefix=prefix, translations=translations)
     40             self._fields[name] = field
     41 

path/wtforms/fields/core.pyc in bind(self, form, name, prefix, translations, **kwargs)
    299 
    300     def bind(self, form, name, prefix='', translations=None, **kwargs):
--> 301         return self.field_class(_form=form, _prefix=prefix, _name=name, _translations=translations, *self.args, **dict(self.kwargs, **kwargs))
    302 
    303     def __repr__(self):

TypeError: __init__() got an unexpected keyword argument '_form'

_form フィールドが適切にインスタンス化されていないと思います。これを行う方法はありますか?ありがとうございました

4

1 に答える 1

1

MyField.__init__メソッドに必要なキーワード引数がありません。これを試して:

class MyField(TextField):
    def __init__(self, **kwargs):  # You were missing the **kwargs
        super(MyField, self).__init__(**kwargs)

関数呼び出しの*and**演算子(?)は、次のことを行います。

  • 関数シグネチャで使用する場合、残りのすべての位置 ( *) またはキーワード ( **) 引数をtuple/ (それぞれ) に配置し、データを/dictに続く名前にバインドする必要があることを指定します。***
  • 関数呼び出しで使用する場合、tupleor list(for *) またはdict(for **) をアンパックして、引数のリスト / キーワード引数として関数に渡す必要があることを指定します。
于 2012-09-18T15:40:22.733 に答える