0
class Form(Form):
    def forms(self):
        name = TextField('name', validators=[Required()])

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        form = Form()
        self.render('index.html', form=form.forms())

テンプレート:

<form method="post" action="/test">
    {% raw form.name(type='text') %}
</form>

エラー:

AttributeError: 'NoneType' オブジェクトに属性 'name' がありません


ただし、これは機能しますが、クラスフォーム内に関数が必要です:

class Form(Form):
      name = TextField('name', validators=[Required()])

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        form = Form()
        self.render('index.html', form=form)
4

3 に答える 3

5

あなたのforms()メソッドは何も返しません:

class Form(Form):
    def forms(self):
        name = TextField('name', validators=[Required()])

デフォルトでは、その場合に戻りますNoneForm().forms()の結果をテンプレートに渡すため、最終的には になりますform=None

nameメソッドを呼び出した後にのみインスタンスを設定する必要がある場合はForm、そのメソッドで設定します。

class Form(Form):
    def forms(self):
        name = TextField('name', validators=[Required()])
        self.name = name.bind(form=self, name='name', 
                              prefix=self._prefix,
                              translations=self._get_translations())
        self._fields['name'] = self.name
        self.process()

フィールドの場合は、フィールドを使用する前にフォームにバインドするwtforms必要があります。通常、フレームワークがこれを処理します。

次に、そのメソッドを個別に呼び出します。

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        form = Form()
        form.forms()
        self.render('index.html', form=form)
于 2013-10-24T14:25:02.463 に答える
1

name 属性を持つ Form オブジェクトが必要です。2 番目のバージョンは、name というクラス変数を持つ Form オブジェクトを作成するため機能します。オブジェクト自体ではなく、form.forms()の結果を含む文字列を返すため、最初のバージョンはそうではありません。

あなたはこれを求めている:

class Form(object):
    def __init__(self):
        self.name = TextField('name', validators=[Required()])

その後、前と同じフォームを使用します。

self.render('index.html', form=form)

後で self.name を変更する必要がある場合は、上記を再度実行する関数を追加します。

于 2013-10-24T14:30:12.290 に答える