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”对象没有属性“名称”


然而,这可行,但我需要类Form中的一个函数:

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()])

在这种情况下默认是返回None。由于您将结果传递Form().forms()给模板,因此您最终得到form=None.

如果您只需要nameForm实例上调用方法后对其进行设置,请在该方法中执行此操作:

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 对象。第二个版本之所以有效,是因为它创建了一个带有名为 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 回答
1

如果要设置实例变量,则必须使用self. 否则,它只是一个在函数结束时消失的局部变量。

def forms(self):
    self.name = TextField('name', validators=[Required()])
于 2013-10-24T14:21:47.727 回答